mirror of
https://github.com/tenrok/axios.git
synced 2026-05-24 14:04:14 +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.
71 lines
1.7 KiB
JavaScript
71 lines
1.7 KiB
JavaScript
var buildUrl = require('./../buildUrl');
|
|
var defaults = require('./../defaults');
|
|
var transformData = require('./../transformData');
|
|
var utils = require('./../utils');
|
|
var http = require('http');
|
|
var url = require('url');
|
|
var Buffer = require('buffer').Buffer;
|
|
|
|
module.exports = function httpAdapter(resolve, reject, config) {
|
|
// Transform request data
|
|
var data = transformData(
|
|
config.data,
|
|
config.headers,
|
|
config.transformRequest
|
|
);
|
|
|
|
if (utils.isArrayBuffer(data)) {
|
|
data = new Buffer(new Uint8Array(data));
|
|
}
|
|
|
|
// Merge headers
|
|
var headers = utils.merge(
|
|
defaults.headers.common,
|
|
defaults.headers[config.method] || {},
|
|
config.headers || {}
|
|
);
|
|
|
|
// Add Content-Length header if data exists
|
|
if (data) {
|
|
headers['Content-Length'] = data.length;
|
|
}
|
|
|
|
// Parse url
|
|
var parsed = url.parse(config.url);
|
|
var options = {
|
|
host: parsed.hostname,
|
|
port: parsed.port,
|
|
path: buildUrl(parsed.path, config.params).replace(/^\?/, ''),
|
|
method: config.method,
|
|
headers: headers
|
|
};
|
|
|
|
// Create the request
|
|
var req = http.request(options, function (res) {
|
|
var responseText = '';
|
|
res.on('data', function (chunk) {
|
|
responseText += chunk;
|
|
});
|
|
|
|
res.on('end', function () {
|
|
var response = {
|
|
data: transformData(
|
|
responseText,
|
|
res.headers,
|
|
config.transformResponse
|
|
),
|
|
status: res.statusCode,
|
|
headers: res.headers,
|
|
config: config
|
|
};
|
|
|
|
// Resolve or reject the Promise based on the status
|
|
(res.statusCode >= 200 && res.statusCode < 300
|
|
? resolve
|
|
: reject)(response);
|
|
});
|
|
});
|
|
|
|
// Send the request
|
|
req.end(data);
|
|
}; |