mirror of
https://github.com/tenrok/axios.git
synced 2026-05-15 11:59:42 +03:00
2f4d0b8b45
When data passed to axios is of type FormData we have to let the browser
create the Content-Type header so that the boundaries will get right
etc.
Usage:
```js
var data = new FormData();
data.append('field', 'some string');
data.append('file', someFile);
var opts = {
transformRequest: function(data) { return data; }
};
axios.post('/fileupload', data, opts);
```
100 lines
2.6 KiB
JavaScript
100 lines
2.6 KiB
JavaScript
var defaults = require('./../defaults');
|
|
var utils = require('./../utils');
|
|
var buildUrl = require('./../helpers/buildUrl');
|
|
var cookies = require('./../helpers/cookies');
|
|
var parseHeaders = require('./../helpers/parseHeaders');
|
|
var transformData = require('./../helpers/transformData');
|
|
var urlIsSameOrigin = require('./../helpers/urlIsSameOrigin');
|
|
|
|
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 || {}
|
|
);
|
|
|
|
if (utils.isFormData(data)) {
|
|
delete headers['Content-Type']; // Let the browser set it
|
|
}
|
|
|
|
// 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);
|
|
}; |