Skip to content

Instantly share code, notes, and snippets.

@ProdigyView
Created September 30, 2013 16:12
Show Gist options
  • Save ProdigyView/6766189 to your computer and use it in GitHub Desktop.
Save ProdigyView/6766189 to your computer and use it in GitHub Desktop.
Implemented CORS for AngularJS and IE8 + IE9
function $HttpBackendProvider() {
this.$get = ['$browser', '$window', '$document', function($browser, $window, $document) {
var params = [$browser, XHR, $browser.defer, $window.angular.callbacks, $document[0], $window.location.protocol.replace(':', '')]; /*orig xhr */
var param4ie = params.concat([msie,createHttpBackend.apply(this,params)]);
return (angular.ieCreateHttpBackend && angular.ieCreateHttpBackend.apply(this, param4ie)) ||
createHttpBackend.apply(this, params);
}];
}
function ieCreateHttpBackend($browser, XHR, $browserDefer, callbacks, rawDocument, locationProtocol, msie, xhr) {
if (!msie || msie > 9) return null;
var getHostName = function (path) {
var a = document.createElement('a');
a.href = path;
return a.hostname;
}
var isLocalCall = function (reqUrl) {
var reqHost = getHostName(reqUrl),
localHost = getHostName($browser.url());
var patt = new RegExp( localHost + "$", 'i');
return patt.test(reqHost);
}
function completeRequest(callback, status, response, headersString) {
var url = url || $browser.url(),
URL_MATCH = /^([^:]+):\/\/(\w+:{0,1}\w*@)?(\{?[\w\.-]*\}?)(:([0-9]+))?(\/[^\?#]*)?(\?([^#]*))?(#(.*))?$/;
// URL_MATCH is defined in src/service/location.js
var protocol = (url.match(URL_MATCH) || ['', locationProtocol])[1];
// fix status code for file protocol (it's always 0)
status = (protocol == 'file') ? (response ? 200 : 404) : status;
// normalize IE bug (http://bugs.jquery.com/ticket/1450)
status = status == 1223 ? 204 : status;
callback(status, response, headersString);
$browser.$$completeOutstandingRequest(angular.noop);
}
var pmHandler = function (method, url, post, callback, headers, timeout, withCredentials) {
var win = $('[name="' + getHostName(url) + '"]')[0].id ;
var pm = window.pm || pm;
pm({
target: window.frames[win],
type: 'xhrRequest',
data: {
headers: headers,
method: method,
data: post,
url: url
},
success: function (respObj) {
completeRequest(callback, 200, respObj.responseText, 'Content-Type: ' + respObj.contentType);
},
error: function (data) {
completeRequest(callback, 500, 'Error', 'Content-Type: text/plain');
}
});
}
return function (method, url, post, callback, headers, timeout, withCredentials) {
$browser.$$incOutstandingRequestCount();
url = url || $browser.url();
if (isLocalCall(url) ) {
xhr(method, url, post, callback, headers, timeout, withCredentials);
} else {
pmHandler(method, url, post, callback, headers, timeout, withCredentials);
}
if (timeout > 0) {
$browserDefer(function () {
var status = -1;
var xdr = window.xdr || xdr;
xdr.abort();
}, timeout);
}
}
}
function createHttpBackend($browser, XHR, $browserDefer, callbacks, rawDocument, locationProtocol) {
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment