adapter
getDefaultAdapter
function getDefaultAdapter(){
var adapter
if(typeof XMLHttpRequest !== 'undefined'){
adapter = require('./adapters/xhr')
}else if(typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]'){
adapter = require('./adapters/http')
}
return adapter
}
xhr
function xhrAdapter(config){
return new Promise(function(resolve,reject){
var requestData = config.data
var requestHeaders = config.headers
var responseType = config.responseType
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' + bota(username + ':' + password)
}
var fullPath = buildFullPath(config.baseURL,config.url)
request.open(config.method.toUpperCase(),buldURL(fullPath,config.params,config.paramsSerializer),true)
request.timeout = config.timeout
function onloadend(){
if(!request){
return
}
const responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null
var responseData = !responseType || responseType=== 'text' || responseType === 'json' ? response.responseText : response.response
var response = {data:responseData,status:request.status,statusText:request.statusText,headers:responseHeaders,config,request}
settle(resolve,reject,response)
request = null
}
if('onloadend' in request){
request.onloadend = onloadend
}else{
request.onreadystatechange = function(){
if(!request || !request.readyState !== 4){
return
}
if(request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)){
return
}
setTimeout(onloadend)
}
}
request.onabort = function(){
if(!request) return
reject(createError('Request aborted',config,'ECONNABORTED',request))
request = null
}
request.onerror = function(){
reject(createError('Network Error',config,null,request))
request = null
}
request.ontimeout = function(){
var timeoutErrorMessage = 'timeout of'+config.timeout+ 'ms exceeded'
if(config.timeoutErrorMessage){
timeoutErrorMessage = config.timeoutErrorMessage
}
reject(createError(timeoutErrorMessage,config,config.transitional && config.transitional.clarifyTimeoutError ? 'ETIMEDOUT' : 'ECONNABORTED',request))
request = null
}
if(utils.isStandardBrowserEnv()){
var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ? cookies.read(config.xsrfCookieName) :null
if(xsrfValue){
requestHeaders[config.xsrfCookieName] = xsrfValue
}
}
if('setRequestHeader' in request){
utils.forEach(requestHeaders,function(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.cancelToken.promise.then(function(cancel){
if(!request){
return
}
request.abort()
reject(cancel)
request = null
})
}
if(!requestData){
requestData = null
}
request.send(requestData)
})
}
buildFullPath
function buildFullPath(baseURL,requestedURL){
if(baseURL && !isAbsoluteURL(requestedURL)){
return combineURLs(baseURL,requestedURL)
}
return requestedURL
}
isAbsoluteURL
function isAbsoluteURL(url){
return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url)
}
combineURLs
function combineURLs(baseUrl,relativeUrl){
return relativeUrl ? baseUrl.replace(/\/+$/,'')+'/'+relativeUrl.replace(/^\/+/,'') : baseUrl
parseHeaders
var ignoreDuplicateOf = ['age','authorization','content-length','content-type','etag','expires','from','host','if-modified-since','if-unmodified-since','last-modified','location','max-forwards','proxy-authorization','referer','retry-after','user-agent']
function parseHeaders(headers){
var parsed = {}
var key,val,i;
if(!headers){return parsed}
utils.forEach(headers.split('\n'),function(line){
i = line.indexOf(':')
key = utils.trim(line.substr(0,i)).toLowerCase()
val = utils.trim(line.substr(i+1))
if(key){
if(parsed[key] && ignoreDuplicatedOf.indexOf(key) >= 0){
return
}
if(key === 'set-cookie'){
parsed[key] = (parsed[key] ? parsed[key] : []).concat([val])
}else{
parsed[key] = parsed[key] ? parsed[key] +','+val:val
}
}
})
return parsed
}
settle
function settle(resolve,reject,response){
var validateStatus = response.config.validateStatus
if(!response.status|| !validateStatus || validateStatus(response.status)){
resolve(response)
}else{
reject(createError('Request Failed with status code:' + response.status,response.config,null,response.request,response))
}
}
createError
function createError(message,config,code,request,response){
var error = new Error(message)
return enhanceError(error,config,code,request,response)
}
cookies
module.exports = {
utils.isStandardBrowserEnv() ? (function standardBrowserEnv(){
return {
write:(name,value,expires,path,domain,secure) => {
var cookie = []
cookie.push(name +'='+encodeURIComponent(value))
if(utils.isNumber(expires)){
cookie.push('expires='+new Date(expires).toGMTString())
}
if(utils.isString(path)){
cookie.push('path='+path)
}
if(utils.isString(domain)){
cookie.push('domain='+domain)
}
if(secure == true){
cookie.push('secure')
}
document.cookie = cookie.join(';')
},
read:(name) => {
var match = document.cookie.match(new RegExp(`(^|;\\s*)(${name})=([^;]*)`))
return match ? decodeURIComponent(match[3]) : null
},
remove:(name)=>{
this.write(name,'',Date.now() - 86400000)
}
}
})() : (function nonStandardBrowserEnv(){
return {
write:() => {},
read:() => null,
remove:() => {}
}
})()
}
isStandardBrowserEnv
function isStandardBrowserEnv(){
if(typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' || navigator.product === 'NativeScript' || navigator.product === 'NS')){
return false
}
return typeof window !== 'undefined' && typeof document !== 'undefined'
}