var utils = require('./../utils'); var transformData = require('./transformData'); var isCancel = require('../cancel/isCancel'); var defaults = require('../defaults'); var isAbsoluteURL = require('./../helpers/isAbsoluteURL'); var combineURLs = require('./../helpers/combineURLs');
/** * Throws a `Cancel` if cancellation has been requested. */ functionthrowIfCancellationRequested(config) { if (config.cancelToken) { config.cancelToken.throwIfRequested(); } }
/** * Dispatch a request to the server using the configured adapter. * * @param {object}config The config that is to be used for the request * @returns {Promise}The Promise to be fulfilled */ module.exports = functiondispatchRequest(config) { throwIfCancellationRequested(config);
// Support baseURL config if (config.baseURL && !isAbsoluteURL(config.url)) { config.url = combineURLs(config.baseURL, config.url); }
var requestData = config.data; var requestHeaders = config.headers; if (utils.isFormData(requestData)) { delete requestHeaders['Content-Type']; // Let the browser set it }
if (config.auth) { var username = config.auth.username || ''; var password = config.auth.password || ''; requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password); }
var utils = require('./../utils'); var settle = require('./../core/settle'); var buildURL = require('./../helpers/buildURL'); var parseHeaders = require('./../helpers/parseHeaders'); var isURLSameOrigin = require('./../helpers/isURLSameOrigin'); var createError = require('../core/createError'); var btoa = (typeofwindow !== 'undefined' && window.btoa && window.btoa.bind(window)) || require('./../helpers/btoa');
module.exports = functionxhrAdapter(config) { returnnewPromise(functiondispatchXhrRequest(resolve, reject) { var requestData = config.data; var requestHeaders = config.headers;
if (utils.isFormData(requestData)) { delete requestHeaders['Content-Type']; // Let the browser set it }
var request = new XMLHttpRequest(); var loadEvent = 'onreadystatechange'; var xDomain = false;
// For IE 8/9 CORS support // Only supports POST and GET calls and doesn't returns the response headers. // DON'T do this for testing b/c XMLHttpRequest is mocked, not XDomainRequest. if (process.env.NODE_ENV !== 'test' && typeofwindow !== 'undefined' && window.XDomainRequest && !('withCredentials'in request) && !isURLSameOrigin(config.url)) { request = newwindow.XDomainRequest(); loadEvent = 'onload'; xDomain = true; request.onprogress = functionhandleProgress() { }; request.ontimeout = functionhandleTimeout() { }; }
// HTTP basic authentication if (config.auth) { var username = config.auth.username || ''; var password = config.auth.password || ''; requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password); }
// Set the request timeout in MS request.timeout = config.timeout;
// Listen for ready state request[loadEvent] = functionhandleLoad() { if (!request || (request.readyState !== 4 && !xDomain)) { return; }
// The request errored out and we didn't get a response, this will be // handled by onerror instead // With one exception: request that using file: protocol, most browsers // will return status as 0 even though it's a successful request if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) { return; }
// Handle low level network errors request.onerror = functionhandleError() { // Real errors are hidden from us by the browser // onerror should only fire if it's a network error reject(createError('Network Error', config, null, request));
// Add xsrf header // This is only done if running in a standard browser environment. // Specifically not if we're in a web worker, or react-native. if (utils.isStandardBrowserEnv()) { var cookies = require('./../helpers/cookies');
if (xsrfValue) { requestHeaders[config.xsrfHeaderName] = xsrfValue; } }
// Add headers to the request if ('setRequestHeader'in request) { utils.forEach(requestHeaders, functionsetRequestHeader(val, key) { if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') { // Remove Content-Type if data is undefined delete requestHeaders[key]; } else { // Otherwise add header to the request request.setRequestHeader(key, val); } }); }
// Add withCredentials to request if needed if (config.withCredentials) { request.withCredentials = true; }
// Add responseType to request if needed if (config.responseType) { try { request.responseType = config.responseType; } catch (e) { // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2. // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function. if (config.responseType !== 'json') { throw e; } } }
// Handle progress if needed if (typeof config.onDownloadProgress === 'function') { request.addEventListener('progress', config.onDownloadProgress); }
// Not all browsers support upload events if (typeof config.onUploadProgress === 'function' && request.upload) { request.upload.addEventListener('progress', config.onUploadProgress); }
if (config.cancelToken) { // Handle cancellation config.cancelToken.promise.then(functiononCanceled(cancel) { if (!request) { return; }