2
0
mirror of https://github.com/tenrok/axios.git synced 2026-05-24 14:04:14 +03:00
Files
axios/lib/adapters/http.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

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