mirror of
https://github.com/tenrok/axios.git
synced 2026-06-20 20:00:40 +03:00
add xDomainRequest adapter
This commit is contained in:
@@ -186,6 +186,10 @@ This is the available config options for making requests. Only the `url` is requ
|
|||||||
// If the request takes longer than `timeout`, the request will be aborted.
|
// If the request takes longer than `timeout`, the request will be aborted.
|
||||||
timeout: 1000,
|
timeout: 1000,
|
||||||
|
|
||||||
|
// `xDomain` indicates whether the request is cross domain.
|
||||||
|
// This option is required to be passed to support cross domain requests on IE 8/9
|
||||||
|
xDomain: false, //default
|
||||||
|
|
||||||
// `withCredentials` indicates whether or not cross-site Access-Control requests
|
// `withCredentials` indicates whether or not cross-site Access-Control requests
|
||||||
// should be made using credentials
|
// should be made using credentials
|
||||||
withCredentials: false, // default
|
withCredentials: false, // default
|
||||||
|
|||||||
Vendored
+1123
-175
File diff suppressed because it is too large
Load Diff
Vendored
+1
-1
File diff suppressed because one or more lines are too long
Vendored
+8
-2
File diff suppressed because one or more lines are too long
Vendored
+1
-1
File diff suppressed because one or more lines are too long
@@ -10,7 +10,7 @@
|
|||||||
<form role="form" class="form" onsubmit="return false;">
|
<form role="form" class="form" onsubmit="return false;">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="data">JSON</label>
|
<label for="data">JSON</label>
|
||||||
<textarea id="data" class="form-control" rows="5"></textarea>
|
<textarea id="data" class="form-control" rows="5">"data"</textarea>
|
||||||
</div>
|
</div>
|
||||||
<button id="post" type="button" class="btn btn-primary">POST</button>
|
<button id="post" type="button" class="btn btn-primary">POST</button>
|
||||||
</form>
|
</form>
|
||||||
@@ -24,7 +24,9 @@
|
|||||||
document.getElementById('post').onclick = function () {
|
document.getElementById('post').onclick = function () {
|
||||||
var data = document.getElementById('data').value;
|
var data = document.getElementById('data').value;
|
||||||
|
|
||||||
axios.post('/post/server', JSON.parse(data))
|
axios.post('/post/server', data,{
|
||||||
|
xDomain : true
|
||||||
|
},JSON.parse(data))
|
||||||
.then(function (res) {
|
.then(function (res) {
|
||||||
output.className = 'container';
|
output.className = 'container';
|
||||||
output.innerHTML = res.data;
|
output.innerHTML = res.data;
|
||||||
|
|||||||
@@ -76,6 +76,7 @@ dirs = listDirs(__dirname);
|
|||||||
|
|
||||||
server = http.createServer(function (req, res) {
|
server = http.createServer(function (req, res) {
|
||||||
var url = req.url;
|
var url = req.url;
|
||||||
|
res.setHeader("Access-Control-Allow-Origin", "*");
|
||||||
|
|
||||||
// Process axios itself
|
// Process axios itself
|
||||||
if (/axios\.min\.js$/.test(url)) {
|
if (/axios\.min\.js$/.test(url)) {
|
||||||
|
|||||||
+28
-16
@@ -27,18 +27,30 @@ module.exports = function xhrAdapter(resolve, reject, config) {
|
|||||||
delete requestHeaders['Content-Type']; // Let the browser set it
|
delete requestHeaders['Content-Type']; // Let the browser set it
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var adapter = (XMLHttpRequest || ActiveXObject),
|
||||||
|
loadEvent = 'onreadystatechange',
|
||||||
|
xDomain = false;
|
||||||
|
|
||||||
|
// For IE 8/9 CORS support
|
||||||
|
if(config.xDomain && (window && window.XDomainRequest)){
|
||||||
|
adapter = window.XDomainRequest;
|
||||||
|
loadEvent = 'onload';
|
||||||
|
xDomain = true;
|
||||||
|
}
|
||||||
|
|
||||||
// Create the request
|
// Create the request
|
||||||
var request = new (XMLHttpRequest || ActiveXObject)('Microsoft.XMLHTTP');
|
var request = new adapter('Microsoft.XMLHTTP');
|
||||||
|
|
||||||
request.open(config.method.toUpperCase(), buildUrl(config.url, config.params, config.paramsSerializer), true);
|
request.open(config.method.toUpperCase(), buildUrl(config.url, config.params, config.paramsSerializer), true);
|
||||||
|
|
||||||
// Set the request timeout in MS
|
// Set the request timeout in MS
|
||||||
request.timeout = config.timeout;
|
request.timeout = config.timeout;
|
||||||
|
|
||||||
// Listen for ready state
|
// Listen for ready state
|
||||||
request.onreadystatechange = function () {
|
request[loadEvent] = function () {
|
||||||
if (request && request.readyState === 4) {
|
if (request && (request.readyState === 4 || xDomain)) {
|
||||||
// Prepare the response
|
// Prepare the response
|
||||||
var responseHeaders = parseHeaders(request.getAllResponseHeaders());
|
var responseHeaders = xDomain ? null : parseHeaders(request.getAllResponseHeaders());
|
||||||
var responseData = ['text', ''].indexOf(config.responseType || '') !== -1 ? request.responseText : request.response;
|
var responseData = ['text', ''].indexOf(config.responseType || '') !== -1 ? request.responseText : request.response;
|
||||||
var response = {
|
var response = {
|
||||||
data: transformData(
|
data: transformData(
|
||||||
@@ -51,9 +63,8 @@ module.exports = function xhrAdapter(resolve, reject, config) {
|
|||||||
headers: responseHeaders,
|
headers: responseHeaders,
|
||||||
config: config
|
config: config
|
||||||
};
|
};
|
||||||
|
|
||||||
// Resolve or reject the Promise based on the status
|
// Resolve or reject the Promise based on the status
|
||||||
(request.status >= 200 && request.status < 300 ?
|
((request.status >= 200 && request.status < 300) || (request.responseText && xDomain) ?
|
||||||
resolve :
|
resolve :
|
||||||
reject)(response);
|
reject)(response);
|
||||||
|
|
||||||
@@ -80,16 +91,17 @@ module.exports = function xhrAdapter(resolve, reject, config) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Add headers to the request
|
// Add headers to the request
|
||||||
utils.forEach(requestHeaders, function (val, key) {
|
if(!xDomain)
|
||||||
// Remove Content-Type if data is undefined
|
utils.forEach(requestHeaders, function (val, key) {
|
||||||
if (!data && key.toLowerCase() === 'content-type') {
|
// Remove Content-Type if data is undefined
|
||||||
delete requestHeaders[key];
|
if (!data && key.toLowerCase() === 'content-type') {
|
||||||
}
|
delete requestHeaders[key];
|
||||||
// Otherwise add header to the request
|
}
|
||||||
else {
|
// Otherwise add header to the request
|
||||||
request.setRequestHeader(key, val);
|
else {
|
||||||
}
|
request.setRequestHeader(key, val);
|
||||||
});
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Add withCredentials to request if needed
|
// Add withCredentials to request if needed
|
||||||
if (config.withCredentials) {
|
if (config.withCredentials) {
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ var utils = require('./utils');
|
|||||||
var dispatchRequest = require('./core/dispatchRequest');
|
var dispatchRequest = require('./core/dispatchRequest');
|
||||||
var InterceptorManager = require('./core/InterceptorManager');
|
var InterceptorManager = require('./core/InterceptorManager');
|
||||||
|
|
||||||
|
require('es6-promise').polyfill();
|
||||||
|
|
||||||
function Axios (defaultConfig) {
|
function Axios (defaultConfig) {
|
||||||
this.defaultConfig = utils.merge({
|
this.defaultConfig = utils.merge({
|
||||||
headers: {},
|
headers: {},
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
"description": "Promise based HTTP client for the browser and node.js",
|
"description": "Promise based HTTP client for the browser and node.js",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
"build": "grunt build",
|
||||||
"test": "grunt test",
|
"test": "grunt test",
|
||||||
"start": "node ./sandbox/server.js",
|
"start": "node ./sandbox/server.js",
|
||||||
"examples": "node ./examples/server.js",
|
"examples": "node ./examples/server.js",
|
||||||
|
|||||||
@@ -54,6 +54,40 @@ describe('requests', function () {
|
|||||||
}, 0);
|
}, 0);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should make cross domian http request', function (done) {
|
||||||
|
var request, response;
|
||||||
|
|
||||||
|
axios({
|
||||||
|
method: 'post',
|
||||||
|
url: 'www.someurl.com/foo'
|
||||||
|
}).then(function(res){
|
||||||
|
response = res;
|
||||||
|
});
|
||||||
|
|
||||||
|
setTimeout(function () {
|
||||||
|
request = jasmine.Ajax.requests.mostRecent();
|
||||||
|
request.respondWith({
|
||||||
|
status: 200,
|
||||||
|
statusText: 'OK',
|
||||||
|
responseText: '{"foo": "bar"}',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
setTimeout(function () {
|
||||||
|
expect(response.data.foo).toEqual('bar');
|
||||||
|
expect(response.status).toEqual(200);
|
||||||
|
expect(response.statusText).toEqual('OK');
|
||||||
|
expect(response.headers['content-type']).toEqual('application/json');
|
||||||
|
done();
|
||||||
|
}, 0);
|
||||||
|
|
||||||
|
}, 0);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
it('should supply correct response', function (done) {
|
it('should supply correct response', function (done) {
|
||||||
var request, response;
|
var request, response;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user