Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
MR414N-ID
GitHub Repository: MR414N-ID/botku2
Path: blob/master/node_modules/axios/lib/adapters/xhr.js
1126 views
1
'use strict';
2
3
var utils = require('./../utils');
4
var settle = require('./../core/settle');
5
var cookies = require('./../helpers/cookies');
6
var buildURL = require('./../helpers/buildURL');
7
var buildFullPath = require('../core/buildFullPath');
8
var parseHeaders = require('./../helpers/parseHeaders');
9
var isURLSameOrigin = require('./../helpers/isURLSameOrigin');
10
var createError = require('../core/createError');
11
var defaults = require('../defaults');
12
var Cancel = require('../cancel/Cancel');
13
14
module.exports = function xhrAdapter(config) {
15
return new Promise(function dispatchXhrRequest(resolve, reject) {
16
var requestData = config.data;
17
var requestHeaders = config.headers;
18
var responseType = config.responseType;
19
var onCanceled;
20
function done() {
21
if (config.cancelToken) {
22
config.cancelToken.unsubscribe(onCanceled);
23
}
24
25
if (config.signal) {
26
config.signal.removeEventListener('abort', onCanceled);
27
}
28
}
29
30
if (utils.isFormData(requestData)) {
31
delete requestHeaders['Content-Type']; // Let the browser set it
32
}
33
34
var request = new XMLHttpRequest();
35
36
// HTTP basic authentication
37
if (config.auth) {
38
var username = config.auth.username || '';
39
var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';
40
requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);
41
}
42
43
var fullPath = buildFullPath(config.baseURL, config.url);
44
request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);
45
46
// Set the request timeout in MS
47
request.timeout = config.timeout;
48
49
function onloadend() {
50
if (!request) {
51
return;
52
}
53
// Prepare the response
54
var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;
55
var responseData = !responseType || responseType === 'text' || responseType === 'json' ?
56
request.responseText : request.response;
57
var response = {
58
data: responseData,
59
status: request.status,
60
statusText: request.statusText,
61
headers: responseHeaders,
62
config: config,
63
request: request
64
};
65
66
settle(function _resolve(value) {
67
resolve(value);
68
done();
69
}, function _reject(err) {
70
reject(err);
71
done();
72
}, response);
73
74
// Clean up request
75
request = null;
76
}
77
78
if ('onloadend' in request) {
79
// Use onloadend if available
80
request.onloadend = onloadend;
81
} else {
82
// Listen for ready state to emulate onloadend
83
request.onreadystatechange = function handleLoad() {
84
if (!request || request.readyState !== 4) {
85
return;
86
}
87
88
// The request errored out and we didn't get a response, this will be
89
// handled by onerror instead
90
// With one exception: request that using file: protocol, most browsers
91
// will return status as 0 even though it's a successful request
92
if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {
93
return;
94
}
95
// readystate handler is calling before onerror or ontimeout handlers,
96
// so we should call onloadend on the next 'tick'
97
setTimeout(onloadend);
98
};
99
}
100
101
// Handle browser request cancellation (as opposed to a manual cancellation)
102
request.onabort = function handleAbort() {
103
if (!request) {
104
return;
105
}
106
107
reject(createError('Request aborted', config, 'ECONNABORTED', request));
108
109
// Clean up request
110
request = null;
111
};
112
113
// Handle low level network errors
114
request.onerror = function handleError() {
115
// Real errors are hidden from us by the browser
116
// onerror should only fire if it's a network error
117
reject(createError('Network Error', config, null, request));
118
119
// Clean up request
120
request = null;
121
};
122
123
// Handle timeout
124
request.ontimeout = function handleTimeout() {
125
var timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';
126
var transitional = config.transitional || defaults.transitional;
127
if (config.timeoutErrorMessage) {
128
timeoutErrorMessage = config.timeoutErrorMessage;
129
}
130
reject(createError(
131
timeoutErrorMessage,
132
config,
133
transitional.clarifyTimeoutError ? 'ETIMEDOUT' : 'ECONNABORTED',
134
request));
135
136
// Clean up request
137
request = null;
138
};
139
140
// Add xsrf header
141
// This is only done if running in a standard browser environment.
142
// Specifically not if we're in a web worker, or react-native.
143
if (utils.isStandardBrowserEnv()) {
144
// Add xsrf header
145
var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ?
146
cookies.read(config.xsrfCookieName) :
147
undefined;
148
149
if (xsrfValue) {
150
requestHeaders[config.xsrfHeaderName] = xsrfValue;
151
}
152
}
153
154
// Add headers to the request
155
if ('setRequestHeader' in request) {
156
utils.forEach(requestHeaders, function setRequestHeader(val, key) {
157
if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {
158
// Remove Content-Type if data is undefined
159
delete requestHeaders[key];
160
} else {
161
// Otherwise add header to the request
162
request.setRequestHeader(key, val);
163
}
164
});
165
}
166
167
// Add withCredentials to request if needed
168
if (!utils.isUndefined(config.withCredentials)) {
169
request.withCredentials = !!config.withCredentials;
170
}
171
172
// Add responseType to request if needed
173
if (responseType && responseType !== 'json') {
174
request.responseType = config.responseType;
175
}
176
177
// Handle progress if needed
178
if (typeof config.onDownloadProgress === 'function') {
179
request.addEventListener('progress', config.onDownloadProgress);
180
}
181
182
// Not all browsers support upload events
183
if (typeof config.onUploadProgress === 'function' && request.upload) {
184
request.upload.addEventListener('progress', config.onUploadProgress);
185
}
186
187
if (config.cancelToken || config.signal) {
188
// Handle cancellation
189
// eslint-disable-next-line func-names
190
onCanceled = function(cancel) {
191
if (!request) {
192
return;
193
}
194
reject(!cancel || (cancel && cancel.type) ? new Cancel('canceled') : cancel);
195
request.abort();
196
request = null;
197
};
198
199
config.cancelToken && config.cancelToken.subscribe(onCanceled);
200
if (config.signal) {
201
config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);
202
}
203
}
204
205
if (!requestData) {
206
requestData = null;
207
}
208
209
// Send the request
210
request.send(requestData);
211
});
212
};
213
214