You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					161 lines
				
				4.5 KiB
			
		
		
			
		
	
	
					161 lines
				
				4.5 KiB
			| 
											3 years ago
										 | 'use strict'; | ||
|  | 
 | ||
|  | var utils = require('./../utils'); | ||
|  | var buildURL = require('../helpers/buildURL'); | ||
|  | var InterceptorManager = require('./InterceptorManager'); | ||
|  | var dispatchRequest = require('./dispatchRequest'); | ||
|  | var mergeConfig = require('./mergeConfig'); | ||
|  | var buildFullPath = require('./buildFullPath'); | ||
|  | 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(configOrUrl, config) { | ||
|  |   /*eslint no-param-reassign:0*/ | ||
|  |   // Allow for axios('example/url'[, config]) a la fetch API
 | ||
|  |   if (typeof configOrUrl === 'string') { | ||
|  |     config = config || {}; | ||
|  |     config.url = configOrUrl; | ||
|  |   } else { | ||
|  |     config = configOrUrl || {}; | ||
|  |   } | ||
|  | 
 | ||
|  |   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), | ||
|  |       forcedJSONParsing: validators.transitional(validators.boolean), | ||
|  |       clarifyTimeoutError: validators.transitional(validators.boolean) | ||
|  |     }, 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); | ||
|  |   var fullPath = buildFullPath(config.baseURL, config.url); | ||
|  |   return buildURL(fullPath, config.params, config.paramsSerializer); | ||
|  | }; | ||
|  | 
 | ||
|  | // 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*/ | ||
|  | 
 | ||
|  |   function generateHTTPMethod(isForm) { | ||
|  |     return function httpMethod(url, data, config) { | ||
|  |       return this.request(mergeConfig(config || {}, { | ||
|  |         method: method, | ||
|  |         headers: isForm ? { | ||
|  |           'Content-Type': 'multipart/form-data' | ||
|  |         } : {}, | ||
|  |         url: url, | ||
|  |         data: data | ||
|  |       })); | ||
|  |     }; | ||
|  |   } | ||
|  | 
 | ||
|  |   Axios.prototype[method] = generateHTTPMethod(); | ||
|  | 
 | ||
|  |   Axios.prototype[method + 'Form'] = generateHTTPMethod(true); | ||
|  | }); | ||
|  | 
 | ||
|  | module.exports = Axios; |