diff --git a/lib/adapters/xhr.js b/lib/adapters/xhr.js index f5b9853..c90b9f8 100644 --- a/lib/adapters/xhr.js +++ b/lib/adapters/xhr.js @@ -1,13 +1,10 @@ 'use strict'; -/*global ActiveXObject:true*/ - var utils = require('./../utils'); var buildURL = require('./../helpers/buildURL'); var parseHeaders = require('./../helpers/parseHeaders'); var transformData = require('./../helpers/transformData'); var isURLSameOrigin = require('./../helpers/isURLSameOrigin'); -var ieVersion = require('./../helpers/ieVersion'); var btoa = window.btoa || require('./../helpers/btoa'); 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 } - var Adapter = (XMLHttpRequest || ActiveXObject); - var loadEvent = 'onreadystatechange'; - var xDomain = false; + var request = new XMLHttpRequest(); // For IE 8/9 CORS support - if (ieVersion() <= 9 && !isURLSameOrigin(config.url) && window.XDomainRequest) { - Adapter = window.XDomainRequest; - loadEvent = 'onload'; - xDomain = true; + // Only supports POST and GET calls and doesn't returns the response headers. + if (window.XDomainRequest && !('withCredentials' in request) && !isURLSameOrigin(config.url)) { + request = new window.XDomainRequest(); } // HTTP basic authentication @@ -36,38 +30,37 @@ module.exports = function xhrAdapter(resolve, reject, config) { 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); // Set the request timeout in MS request.timeout = config.timeout; // Listen for ready state - request[loadEvent] = function handleReadyState() { - if (request && (request.readyState === 4 || xDomain)) { - // Prepare the response - 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; + request.onload = function handleLoad() { + if (!request) { + return; } + // 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 @@ -87,7 +80,7 @@ module.exports = function xhrAdapter(resolve, reject, config) { } // Add headers to the request - if (!xDomain) { + if ('setRequestHeader' in request) { utils.forEach(requestHeaders, function setRequestHeader(val, key) { if (!requestData && key.toLowerCase() === 'content-type') { // Remove Content-Type if data is undefined diff --git a/lib/helpers/ieVersion.js b/lib/helpers/ieVersion.js deleted file mode 100644 index ac4f11e..0000000 --- a/lib/helpers/ieVersion.js +++ /dev/null @@ -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 = '', - all[0] - )); - - return v > 4 ? v : undef; -}; diff --git a/test/manual/basic.html b/test/manual/basic.html new file mode 100644 index 0000000..35fa649 --- /dev/null +++ b/test/manual/basic.html @@ -0,0 +1,21 @@ + + + + + + + +An alert should be shown with the {"name":"axios"} + + + + + + + \ No newline at end of file diff --git a/test/manual/cors.html b/test/manual/cors.html new file mode 100644 index 0000000..da6e946 --- /dev/null +++ b/test/manual/cors.html @@ -0,0 +1,20 @@ + + + + + + + +An alert should be shown with {"status":"ok"} + + + + + + + \ No newline at end of file diff --git a/test/manual/fixture.json b/test/manual/fixture.json new file mode 100644 index 0000000..5580765 --- /dev/null +++ b/test/manual/fixture.json @@ -0,0 +1,3 @@ +{ + "name": "axios" +} \ No newline at end of file diff --git a/test/manual/promise.js b/test/manual/promise.js new file mode 100644 index 0000000..2d48351 --- /dev/null +++ b/test/manual/promise.js @@ -0,0 +1,9 @@ +/*! + * @overview es6-promise - a tiny implementation of Promises/A+. + * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald) + * @license Licensed under MIT license + * See https://raw.githubusercontent.com/jakearchibald/es6-promise/master/LICENSE + * @version 3.0.2 + */ + +(function(){"use strict";function lib$es6$promise$utils$$objectOrFunction(x){return typeof x==="function"||typeof x==="object"&&x!==null}function lib$es6$promise$utils$$isFunction(x){return typeof x==="function"}function lib$es6$promise$utils$$isMaybeThenable(x){return typeof x==="object"&&x!==null}var lib$es6$promise$utils$$_isArray;if(!Array.isArray){lib$es6$promise$utils$$_isArray=function(x){return Object.prototype.toString.call(x)==="[object Array]"}}else{lib$es6$promise$utils$$_isArray=Array.isArray}var lib$es6$promise$utils$$isArray=lib$es6$promise$utils$$_isArray;var lib$es6$promise$asap$$len=0;var lib$es6$promise$asap$$toString={}.toString;var lib$es6$promise$asap$$vertxNext;var lib$es6$promise$asap$$customSchedulerFn;var lib$es6$promise$asap$$asap=function asap(callback,arg){lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len]=callback;lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len+1]=arg;lib$es6$promise$asap$$len+=2;if(lib$es6$promise$asap$$len===2){if(lib$es6$promise$asap$$customSchedulerFn){lib$es6$promise$asap$$customSchedulerFn(lib$es6$promise$asap$$flush)}else{lib$es6$promise$asap$$scheduleFlush()}}};function lib$es6$promise$asap$$setScheduler(scheduleFn){lib$es6$promise$asap$$customSchedulerFn=scheduleFn}function lib$es6$promise$asap$$setAsap(asapFn){lib$es6$promise$asap$$asap=asapFn}var lib$es6$promise$asap$$browserWindow=typeof window!=="undefined"?window:undefined;var lib$es6$promise$asap$$browserGlobal=lib$es6$promise$asap$$browserWindow||{};var lib$es6$promise$asap$$BrowserMutationObserver=lib$es6$promise$asap$$browserGlobal.MutationObserver||lib$es6$promise$asap$$browserGlobal.WebKitMutationObserver;var lib$es6$promise$asap$$isNode=typeof process!=="undefined"&&{}.toString.call(process)==="[object process]";var lib$es6$promise$asap$$isWorker=typeof Uint8ClampedArray!=="undefined"&&typeof importScripts!=="undefined"&&typeof MessageChannel!=="undefined";function lib$es6$promise$asap$$useNextTick(){return function(){process.nextTick(lib$es6$promise$asap$$flush)}}function lib$es6$promise$asap$$useVertxTimer(){return function(){lib$es6$promise$asap$$vertxNext(lib$es6$promise$asap$$flush)}}function lib$es6$promise$asap$$useMutationObserver(){var iterations=0;var observer=new lib$es6$promise$asap$$BrowserMutationObserver(lib$es6$promise$asap$$flush);var node=document.createTextNode("");observer.observe(node,{characterData:true});return function(){node.data=iterations=++iterations%2}}function lib$es6$promise$asap$$useMessageChannel(){var channel=new MessageChannel;channel.port1.onmessage=lib$es6$promise$asap$$flush;return function(){channel.port2.postMessage(0)}}function lib$es6$promise$asap$$useSetTimeout(){return function(){setTimeout(lib$es6$promise$asap$$flush,1)}}var lib$es6$promise$asap$$queue=new Array(1e3);function lib$es6$promise$asap$$flush(){for(var i=0;i