2
0
mirror of https://github.com/tenrok/axios.git synced 2026-06-23 20:40:40 +03:00

improve IE support

removes ActiveXObject support, and improves detection of XDomainRequest.
This commit is contained in:
Jorik Tangelder
2016-01-03 12:08:09 +01:00
parent 8425fbe556
commit 986647be59
2 changed files with 29 additions and 59 deletions
+29 -36
View File
@@ -1,13 +1,10 @@
'use strict'; 'use strict';
/*global ActiveXObject:true*/
var utils = require('./../utils'); var utils = require('./../utils');
var buildURL = require('./../helpers/buildURL'); var buildURL = require('./../helpers/buildURL');
var parseHeaders = require('./../helpers/parseHeaders'); var parseHeaders = require('./../helpers/parseHeaders');
var transformData = require('./../helpers/transformData'); var transformData = require('./../helpers/transformData');
var isURLSameOrigin = require('./../helpers/isURLSameOrigin'); var isURLSameOrigin = require('./../helpers/isURLSameOrigin');
var ieVersion = require('./../helpers/ieVersion');
var btoa = window.btoa || require('./../helpers/btoa'); var btoa = window.btoa || require('./../helpers/btoa');
module.exports = function xhrAdapter(resolve, reject, config) { module.exports = function xhrAdapter(resolve, reject, config) {
@@ -18,15 +15,12 @@ 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); var request = new XMLHttpRequest();
var loadEvent = 'onreadystatechange';
var xDomain = false;
// For IE 8/9 CORS support // For IE 8/9 CORS support
if (ieVersion() <= 9 && !isURLSameOrigin(config.url) && window.XDomainRequest) { // Only supports POST and GET calls and doesn't returns the response headers.
Adapter = window.XDomainRequest; if (window.XDomainRequest && !("withCredentials" in request) && !isURLSameOrigin(config.url)) {
loadEvent = 'onload'; request = new window.XDomainRequest();
xDomain = true;
} }
// HTTP basic authentication // HTTP basic authentication
@@ -36,38 +30,37 @@ module.exports = function xhrAdapter(resolve, reject, config) {
requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password); requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);
} }
// Create the request
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[loadEvent] = function handleReadyState() { request.onload = function handleLoad() {
if (request && (request.readyState === 4 || xDomain)) { if (!request) {
// Prepare the response return;
var responseHeaders = xDomain ? null : parseHeaders(request.getAllResponseHeaders());
var responseData = ['text', ''].indexOf(config.responseType || '') !== -1 ? request.responseText : request.response;
var response = {
data: transformData(
responseData,
responseHeaders,
config.transformResponse
),
status: request.status,
statusText: request.statusText,
headers: responseHeaders,
config: config
};
// Resolve or reject the Promise based on the status
((request.status >= 200 && request.status < 300) || (xDomain && request.responseText) ?
resolve :
reject)(response);
// Clean up request
request = null;
} }
// Prepare the response
var responseHeaders = "getAllResponseHeaders" in request ? parseHeaders(request.getAllResponseHeaders()) : null;
var responseData = ['text', ''].indexOf(config.responseType || '') !== -1 ? request.responseText : request.response;
var response = {
data: transformData(
responseData,
responseHeaders,
config.transformResponse
),
status: request.status,
statusText: request.statusText,
headers: responseHeaders,
config: config
};
// Resolve or reject the Promise based on the status
((request.status >= 200 && request.status < 300) || (!("status" in request) && request.responseText) ?
resolve :
reject)(response);
// Clean up request
request = null;
}; };
// Add xsrf header // Add xsrf header
@@ -87,7 +80,7 @@ module.exports = function xhrAdapter(resolve, reject, config) {
} }
// Add headers to the request // Add headers to the request
if (!xDomain) { if ("setRequestHeader" in request) {
utils.forEach(requestHeaders, function setRequestHeader(val, key) { utils.forEach(requestHeaders, function setRequestHeader(val, key) {
if (!requestData && key.toLowerCase() === 'content-type') { if (!requestData && key.toLowerCase() === 'content-type') {
// Remove Content-Type if data is undefined // Remove Content-Type if data is undefined
-23
View File
@@ -1,23 +0,0 @@
'use strict';
/**
* https://gist.github.com/padolsey/527683
*
* A short snippet for detecting versions of IE in JavaScript
* without resorting to user-agent sniffing
*
* @returns {Number|undefined} Number of IE version (5-9), otherwise undefined
*/
module.exports = function ieVersion() {
var undef;
var v = 3;
var div = document.createElement('div');
var all = div.getElementsByTagName('i');
while ((
div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
all[0]
));
return v > 4 ? v : undef;
};