提交 89bd626b 编写于 作者: M mzabriskie

Merging master

......@@ -150,6 +150,7 @@ This is the available config options for making requests. Only the `url` is requ
// `transformRequest` allows changes to the request data before it is sent to the server
// This is only applicable for request methods 'PUT', 'POST', and 'PATCH'
// The last function in the array must return a string or an ArrayBuffer
transformRequest: [function (data) {
// Do whatever you want to transform the data
......@@ -174,6 +175,7 @@ This is the available config options for making requests. Only the `url` is requ
// `data` is the data to be sent as the request body
// Only applicable for request methods 'PUT', 'POST', and 'PATCH'
// When no `transformRequest` is set, must be a string, an ArrayBuffer or a hash
data: {
firstName: 'Fred'
},
......
......@@ -161,10 +161,16 @@ var axios =
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) {
......@@ -208,6 +214,30 @@ var axios =
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
*
......@@ -349,6 +379,8 @@ var axios =
module.exports = {
isArray: isArray,
isArrayBuffer: isArrayBuffer,
isArrayBufferView: isArrayBufferView,
isString: isString,
isNumber: isNumber,
isObject: isObject,
......@@ -483,6 +515,10 @@ var axios =
}
}
if (utils.isArrayBuffer(data)) {
data = new DataView(data);
}
// Send the request
request.send(data);
};
......
此差异已折叠。
......@@ -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);
};
\ No newline at end of file
......@@ -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,
......
......@@ -45,6 +45,42 @@ describe('wrapper', function () {
}
});
it('should support binary data as array buffer', function () {
var input = new Int8Array(2);
input[0] = 1;
input[1] = 2;
axios({
method: 'post',
url: '/foo',
data: input.buffer
});
var request = jasmine.Ajax.requests.mostRecent();
var output = new Int8Array(request.params.buffer);
expect(output.length).toEqual(2);
expect(output[0]).toEqual(1);
expect(output[1]).toEqual(2);
});
it('should support binary data as array buffer view', function () {
var input = new Int8Array(2);
input[0] = 1;
input[1] = 2;
axios({
method: 'post',
url: '/foo',
data: input
});
var request = jasmine.Ajax.requests.mostRecent();
var output = new Int8Array(request.params.buffer);
expect(output.length).toEqual(2);
expect(output[0]).toEqual(1);
expect(output[1]).toEqual(2);
});
it('should remove content-type if data is empty', function () {
axios({
method: 'post',
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册