mirror of
https://github.com/tenrok/axios.git
synced 2026-06-05 16:42:32 +03:00
095a204c5b
In order to push binary data under the form of ArrayBuffer and its related views (Int8Array, ...) one needs not to stringify those. For the XHR adapter there is nothing to do as it natively supports ArrayBuffer in req.send(). Node's http adapter supports only string or Buffer thus a transformation to Buffer is required before setting content length header.
96 lines
2.5 KiB
JavaScript
96 lines
2.5 KiB
JavaScript
var buildUrl = require('./../buildUrl');
|
|
var cookies = require('./../cookies');
|
|
var defaults = require('./../defaults');
|
|
var parseHeaders = require('./../parseHeaders');
|
|
var transformData = require('./../transformData');
|
|
var urlIsSameOrigin = require('./../urlIsSameOrigin');
|
|
var utils = require('./../utils');
|
|
|
|
module.exports = function xhrAdapter(resolve, reject, config) {
|
|
// Transform request data
|
|
var data = transformData(
|
|
config.data,
|
|
config.headers,
|
|
config.transformRequest
|
|
);
|
|
|
|
// Merge headers
|
|
var headers = utils.merge(
|
|
defaults.headers.common,
|
|
defaults.headers[config.method] || {},
|
|
config.headers || {}
|
|
);
|
|
|
|
// Create the request
|
|
var request = new(XMLHttpRequest || ActiveXObject)('Microsoft.XMLHTTP');
|
|
request.open(config.method, buildUrl(config.url, config.params), true);
|
|
|
|
// Listen for ready state
|
|
request.onreadystatechange = function () {
|
|
if (request && request.readyState === 4) {
|
|
// Prepare the response
|
|
var headers = parseHeaders(request.getAllResponseHeaders());
|
|
var response = {
|
|
data: transformData(
|
|
request.responseText,
|
|
headers,
|
|
config.transformResponse
|
|
),
|
|
status: request.status,
|
|
headers: headers,
|
|
config: config
|
|
};
|
|
|
|
// Resolve or reject the Promise based on the status
|
|
(request.status >= 200 && request.status < 300
|
|
? resolve
|
|
: reject)(response);
|
|
|
|
// Clean up request
|
|
request = null;
|
|
}
|
|
};
|
|
|
|
// Add xsrf header
|
|
var xsrfValue = urlIsSameOrigin(config.url)
|
|
? cookies.read(config.xsrfCookieName || defaults.xsrfCookieName)
|
|
: undefined;
|
|
if (xsrfValue) {
|
|
headers[config.xsrfHeaderName || defaults.xsrfHeaderName] = xsrfValue;
|
|
}
|
|
|
|
// Add headers to the request
|
|
utils.forEach(headers, function (val, key) {
|
|
// Remove Content-Type if data is undefined
|
|
if (!data && key.toLowerCase() === 'content-type') {
|
|
delete headers[key];
|
|
}
|
|
// Otherwise add header to the request
|
|
else {
|
|
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) {
|
|
if (request.responseType !== 'json') {
|
|
throw e;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (utils.isArrayBuffer(data)) {
|
|
data = new DataView(data);
|
|
}
|
|
|
|
// Send the request
|
|
request.send(data);
|
|
}; |