2
0
mirror of https://github.com/tenrok/axios.git synced 2026-06-05 16:42:32 +03:00
Files
axios/lib/adapters/xhr.js
T
Mathieu Bruyen 095a204c5b Allow ArrayBuffer and related views as data
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.
2014-09-18 09:17:46 +02:00

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);
};