2
0
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:
Vineet Hawal
2015-10-29 12:51:37 +05:30
parent 11c12b2c65
commit a59bc8d2ae
11 changed files with 1207 additions and 197 deletions
+4
View File
@@ -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
+1123 -175
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
File diff suppressed because one or more lines are too long
+8 -2
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+4 -2
View File
@@ -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;
+1
View File
@@ -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
View File
@@ -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) {
+2
View File
@@ -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: {},
+1
View File
@@ -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",
+34
View File
@@ -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;