149 lines
4.1 KiB
JavaScript
149 lines
4.1 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
var utils = require('./../utils');
|
||
|
var buildURL = require('../helpers/buildURL');
|
||
|
var InterceptorManager = require('./InterceptorManager');
|
||
|
var dispatchRequest = require('./dispatchRequest');
|
||
|
var mergeConfig = require('./mergeConfig');
|
||
|
var validator = require('../helpers/validator');
|
||
|
|
||
|
var validators = validator.validators;
|
||
|
/**
|
||
|
* Create a new instance of Axios
|
||
|
*
|
||
|
* @param {Object} instanceConfig The default config for the instance
|
||
|
*/
|
||
|
function Axios(instanceConfig) {
|
||
|
this.defaults = instanceConfig;
|
||
|
this.interceptors = {
|
||
|
request: new InterceptorManager(),
|
||
|
response: new InterceptorManager()
|
||
|
};
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Dispatch a request
|
||
|
*
|
||
|
* @param {Object} config The config specific for this request (merged with this.defaults)
|
||
|
*/
|
||
|
Axios.prototype.request = function request(config) {
|
||
|
/*eslint no-param-reassign:0*/
|
||
|
// Allow for axios('example/url'[, config]) a la fetch API
|
||
|
if (typeof config === 'string') {
|
||
|
config = arguments[1] || {};
|
||
|
config.url = arguments[0];
|
||
|
} else {
|
||
|
config = config || {};
|
||
|
}
|
||
|
|
||
|
config = mergeConfig(this.defaults, config);
|
||
|
|
||
|
// Set config.method
|
||
|
if (config.method) {
|
||
|
config.method = config.method.toLowerCase();
|
||
|
} else if (this.defaults.method) {
|
||
|
config.method = this.defaults.method.toLowerCase();
|
||
|
} else {
|
||
|
config.method = 'get';
|
||
|
}
|
||
|
|
||
|
var transitional = config.transitional;
|
||
|
|
||
|
if (transitional !== undefined) {
|
||
|
validator.assertOptions(transitional, {
|
||
|
silentJSONParsing: validators.transitional(validators.boolean, '1.0.0'),
|
||
|
forcedJSONParsing: validators.transitional(validators.boolean, '1.0.0'),
|
||
|
clarifyTimeoutError: validators.transitional(validators.boolean, '1.0.0')
|
||
|
}, false);
|
||
|
}
|
||
|
|
||
|
// filter out skipped interceptors
|
||
|
var requestInterceptorChain = [];
|
||
|
var synchronousRequestInterceptors = true;
|
||
|
this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
|
||
|
if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;
|
||
|
|
||
|
requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);
|
||
|
});
|
||
|
|
||
|
var responseInterceptorChain = [];
|
||
|
this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
|
||
|
responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);
|
||
|
});
|
||
|
|
||
|
var promise;
|
||
|
|
||
|
if (!synchronousRequestInterceptors) {
|
||
|
var chain = [dispatchRequest, undefined];
|
||
|
|
||
|
Array.prototype.unshift.apply(chain, requestInterceptorChain);
|
||
|
chain = chain.concat(responseInterceptorChain);
|
||
|
|
||
|
promise = Promise.resolve(config);
|
||
|
while (chain.length) {
|
||
|
promise = promise.then(chain.shift(), chain.shift());
|
||
|
}
|
||
|
|
||
|
return promise;
|
||
|
}
|
||
|
|
||
|
|
||
|
var newConfig = config;
|
||
|
while (requestInterceptorChain.length) {
|
||
|
var onFulfilled = requestInterceptorChain.shift();
|
||
|
var onRejected = requestInterceptorChain.shift();
|
||
|
try {
|
||
|
newConfig = onFulfilled(newConfig);
|
||
|
} catch (error) {
|
||
|
onRejected(error);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
promise = dispatchRequest(newConfig);
|
||
|
} catch (error) {
|
||
|
return Promise.reject(error);
|
||
|
}
|
||
|
|
||
|
while (responseInterceptorChain.length) {
|
||
|
promise = promise.then(responseInterceptorChain.shift(), responseInterceptorChain.shift());
|
||
|
}
|
||
|
|
||
|
return promise;
|
||
|
};
|
||
|
|
||
|
Axios.prototype.getUri = function getUri(config) {
|
||
|
config = mergeConfig(this.defaults, config);
|
||
|
return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\?/, '');
|
||
|
};
|
||
|
|
||
|
// Provide aliases for supported request methods
|
||
|
utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {
|
||
|
/*eslint func-names:0*/
|
||
|
Axios.prototype[method] = function(url, config) {
|
||
|
return this.request(mergeConfig(config || {}, {
|
||
|
method: method,
|
||
|
url: url,
|
||
|
data: (config || {}).data
|
||
|
}));
|
||
|
};
|
||
|
});
|
||
|
|
||
|
utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
|
||
|
/*eslint func-names:0*/
|
||
|
Axios.prototype[method] = function(url, data, config) {
|
||
|
return this.request(mergeConfig(config || {}, {
|
||
|
method: method,
|
||
|
url: url,
|
||
|
data: data
|
||
|
}));
|
||
|
};
|
||
|
});
|
||
|
|
||
|
module.exports = Axios;
|