| 'use strict'; |
|
|
| var utils = require('./../utils'); |
| var settle = require('./../core/settle'); |
| var cookies = require('./../helpers/cookies'); |
| var buildURL = require('./../helpers/buildURL'); |
| var buildFullPath = require('../core/buildFullPath'); |
| var parseHeaders = require('./../helpers/parseHeaders'); |
| var isURLSameOrigin = require('./../helpers/isURLSameOrigin'); |
| var createError = require('../core/createError'); |
| var transitionalDefaults = require('../defaults/transitional'); |
| var Cancel = require('../cancel/Cancel'); |
|
|
| module.exports = function xhrAdapter(config) { |
| return new Promise(function dispatchXhrRequest(resolve, reject) { |
| var requestData = config.data; |
| var requestHeaders = config.headers; |
| var responseType = config.responseType; |
| var onCanceled; |
| function done() { |
| if (config.cancelToken) { |
| config.cancelToken.unsubscribe(onCanceled); |
| } |
|
|
| if (config.signal) { |
| config.signal.removeEventListener('abort', onCanceled); |
| } |
| } |
|
|
| if (utils.isFormData(requestData)) { |
| delete requestHeaders['Content-Type']; |
| } |
|
|
| var request = new XMLHttpRequest(); |
|
|
| |
| if (config.auth) { |
| var username = config.auth.username || ''; |
| var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : ''; |
| requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password); |
| } |
|
|
| var fullPath = buildFullPath(config.baseURL, config.url); |
| request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true); |
|
|
| |
| request.timeout = config.timeout; |
|
|
| function onloadend() { |
| if (!request) { |
| return; |
| } |
| |
| var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null; |
| var responseData = !responseType || responseType === 'text' || responseType === 'json' ? |
| request.responseText : request.response; |
| var response = { |
| data: responseData, |
| status: request.status, |
| statusText: request.statusText, |
| headers: responseHeaders, |
| config: config, |
| request: request |
| }; |
|
|
| settle(function _resolve(value) { |
| resolve(value); |
| done(); |
| }, function _reject(err) { |
| reject(err); |
| done(); |
| }, response); |
|
|
| |
| request = null; |
| } |
|
|
| if ('onloadend' in request) { |
| |
| request.onloadend = onloadend; |
| } else { |
| |
| request.onreadystatechange = function handleLoad() { |
| if (!request || request.readyState !== 4) { |
| return; |
| } |
|
|
| |
| |
| |
| |
| if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) { |
| return; |
| } |
| |
| |
| setTimeout(onloadend); |
| }; |
| } |
|
|
| |
| request.onabort = function handleAbort() { |
| if (!request) { |
| return; |
| } |
|
|
| reject(createError('Request aborted', config, 'ECONNABORTED', request)); |
|
|
| |
| request = null; |
| }; |
|
|
| |
| request.onerror = function handleError() { |
| |
| |
| reject(createError('Network Error', config, null, request)); |
|
|
| |
| request = null; |
| }; |
|
|
| |
| request.ontimeout = function handleTimeout() { |
| var timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded'; |
| var transitional = config.transitional || transitionalDefaults; |
| if (config.timeoutErrorMessage) { |
| timeoutErrorMessage = config.timeoutErrorMessage; |
| } |
| reject(createError( |
| timeoutErrorMessage, |
| config, |
| transitional.clarifyTimeoutError ? 'ETIMEDOUT' : 'ECONNABORTED', |
| request)); |
|
|
| |
| request = null; |
| }; |
|
|
| |
| |
| |
| if (utils.isStandardBrowserEnv()) { |
| |
| var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ? |
| cookies.read(config.xsrfCookieName) : |
| undefined; |
|
|
| if (xsrfValue) { |
| requestHeaders[config.xsrfHeaderName] = xsrfValue; |
| } |
| } |
|
|
| |
| if ('setRequestHeader' in request) { |
| utils.forEach(requestHeaders, function setRequestHeader(val, key) { |
| if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') { |
| |
| delete requestHeaders[key]; |
| } else { |
| |
| request.setRequestHeader(key, val); |
| } |
| }); |
| } |
|
|
| |
| if (!utils.isUndefined(config.withCredentials)) { |
| request.withCredentials = !!config.withCredentials; |
| } |
|
|
| |
| if (responseType && responseType !== 'json') { |
| request.responseType = config.responseType; |
| } |
|
|
| |
| if (typeof config.onDownloadProgress === 'function') { |
| request.addEventListener('progress', config.onDownloadProgress); |
| } |
|
|
| |
| if (typeof config.onUploadProgress === 'function' && request.upload) { |
| request.upload.addEventListener('progress', config.onUploadProgress); |
| } |
|
|
| if (config.cancelToken || config.signal) { |
| |
| |
| onCanceled = function(cancel) { |
| if (!request) { |
| return; |
| } |
| reject(!cancel || (cancel && cancel.type) ? new Cancel('canceled') : cancel); |
| request.abort(); |
| request = null; |
| }; |
|
|
| config.cancelToken && config.cancelToken.subscribe(onCanceled); |
| if (config.signal) { |
| config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled); |
| } |
| } |
|
|
| if (!requestData) { |
| requestData = null; |
| } |
|
|
| |
| request.send(requestData); |
| }); |
| }; |
|
|