mirror of
https://github.com/tenrok/axios.git
synced 2026-06-11 18:02:32 +03:00
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.
This commit is contained in:
@@ -4,6 +4,7 @@ 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
|
||||
@@ -13,6 +14,10 @@ module.exports = function httpAdapter(resolve, reject, config) {
|
||||
config.transformRequest
|
||||
);
|
||||
|
||||
if (utils.isArrayBuffer(data)) {
|
||||
data = new Buffer(new Uint8Array(data));
|
||||
}
|
||||
|
||||
// Merge headers
|
||||
var headers = utils.merge(
|
||||
defaults.headers.common,
|
||||
|
||||
@@ -87,6 +87,10 @@ module.exports = function xhrAdapter(resolve, reject, config) {
|
||||
}
|
||||
}
|
||||
|
||||
if (utils.isArrayBuffer(data)) {
|
||||
data = new DataView(data);
|
||||
}
|
||||
|
||||
// Send the request
|
||||
request.send(data);
|
||||
};
|
||||
+10
-4
@@ -11,10 +11,16 @@ var CONTENT_TYPE_APPLICATION_JSON = {
|
||||
|
||||
module.exports = {
|
||||
transformRequest: [function (data) {
|
||||
return utils.isObject(data) &&
|
||||
!utils.isFile(data) &&
|
||||
!utils.isBlob(data) ?
|
||||
JSON.stringify(data) : data;
|
||||
if (utils.isArrayBuffer(data)) {
|
||||
return data;
|
||||
}
|
||||
if (utils.isArrayBufferView(data)) {
|
||||
return data.buffer;
|
||||
}
|
||||
if (utils.isObject(data) && !utils.isFile(data) && !utils.isBlob(data)) {
|
||||
return JSON.stringify(data);
|
||||
}
|
||||
return data;
|
||||
}],
|
||||
|
||||
transformResponse: [function (data) {
|
||||
|
||||
@@ -12,6 +12,30 @@ function isArray(val) {
|
||||
return toString.call(val) === '[object Array]';
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if a value is an ArrayBuffer
|
||||
*
|
||||
* @param {Object} val The value to test
|
||||
* @returns {boolean} True if value is an ArrayBuffer, otherwise false
|
||||
*/
|
||||
function isArrayBuffer(val) {
|
||||
return toString.call(val) === '[object ArrayBuffer]';
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if a value is a view on an ArrayBuffer
|
||||
*
|
||||
* @param {Object} val The value to test
|
||||
* @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false
|
||||
*/
|
||||
function isArrayBufferView(val) {
|
||||
if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {
|
||||
return ArrayBuffer.isView(val);
|
||||
} else {
|
||||
return (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if a value is a String
|
||||
*
|
||||
@@ -153,6 +177,8 @@ function merge(obj1/*, obj2, obj3, ...*/) {
|
||||
|
||||
module.exports = {
|
||||
isArray: isArray,
|
||||
isArrayBuffer: isArrayBuffer,
|
||||
isArrayBufferView: isArrayBufferView,
|
||||
isString: isString,
|
||||
isNumber: isNumber,
|
||||
isObject: isObject,
|
||||
|
||||
Reference in New Issue
Block a user