aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimmy Willison <timmywillisn@gmail.com>2016-01-05 16:43:18 -0500
committerTimmy Willison <timmywillisn@gmail.com>2016-01-06 14:05:17 -0500
commit373607aa78ce35de10ca12e5bc693a7e375336f9 (patch)
treec3d86c7bfbdf8ed30abea410622c9c59db903076
parente3c89685095cfabdd1060b5d9cb57a62f60b7f2f (diff)
downloadjquery-373607aa78ce35de10ca12e5bc693a7e375336f9.tar.gz
jquery-373607aa78ce35de10ca12e5bc693a7e375336f9.zip
Revert "Ajax: use anchor tag for parsing urls"
This reverts commit de7ae8cd17a22b0275217a6ca0345d9d5a97c6dd.
-rw-r--r--src/ajax.js59
-rw-r--r--test/unit/ajax.js6
2 files changed, 27 insertions, 38 deletions
diff --git a/src/ajax.js b/src/ajax.js
index 45e8cfe21..c7013c093 100644
--- a/src/ajax.js
+++ b/src/ajax.js
@@ -15,12 +15,15 @@ define( [
var
rhash = /#.*$/,
rts = /([?&])_=[^&]*/,
- rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
+
+ // IE leaves an \r character at EOL
+ rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg,
// #7653, #8125, #8152: local protocol detection
rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
rnoContent = /^(?:GET|HEAD)$/,
rprotocol = /^\/\//,
+ rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
/* Prefilters
* 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
@@ -43,10 +46,11 @@ var
// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
allTypes = "*/".concat( "*" ),
- // Anchor tag for parsing the document origin
- originAnchor = document.createElement( "a" );
+ // Document location
+ ajaxLocation = location.href,
- originAnchor.href = location.href;
+ // Segment location into parts
+ ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
function addToPrefiltersOrTransports( structure ) {
@@ -295,9 +299,9 @@ jQuery.extend( {
etag: {},
ajaxSettings: {
- url: location.href,
+ url: ajaxLocation,
type: "GET",
- isLocal: rlocalProtocol.test( location.protocol ),
+ isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
global: true,
processData: true,
async: true,
@@ -391,6 +395,9 @@ jQuery.extend( {
var
+ // Cross-domain detection vars
+ parts,
+
// Loop variable
i,
@@ -403,9 +410,6 @@ jQuery.extend( {
// timeout handle
timeoutTimer,
- // Url cleanup var
- urlAnchor,
-
// To know if global events are to be dispatched
fireGlobals,
@@ -524,8 +528,9 @@ jQuery.extend( {
// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
// Handle falsy url in the settings object (#10093: consistency with old signature)
// We also use the url parameter if available
- s.url = ( ( url || s.url || location.href ) + "" ).replace( rhash, "" )
- .replace( rprotocol, location.protocol + "//" );
+ s.url = ( ( url || s.url || ajaxLocation ) + "" )
+ .replace( rhash, "" )
+ .replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
// Alias method option to type as per ticket #12004
s.type = options.method || options.type || s.method || s.type;
@@ -533,26 +538,14 @@ jQuery.extend( {
// Extract dataTypes list
s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
- // A cross-domain request is in order when the origin doesn't match the current origin
+ // A cross-domain request is in order when we have a protocol:host:port mismatch
if ( s.crossDomain == null ) {
- urlAnchor = document.createElement( "a" );
-
- // Support: IE6-11+
- // IE throws exception if url is malformed, e.g. http://example.com:80x/
- try {
- urlAnchor.href = s.url;
-
- // Support: IE6-11+
- // Anchor's host property isn't correctly set when s.url is relative
- urlAnchor.href = urlAnchor.href;
- s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
- urlAnchor.protocol + "//" + urlAnchor.host;
- } catch ( e ) {
-
- // If there is an error parsing the URL, assume it is crossDomain,
- // it can be rejected by the transport if it is invalid
- s.crossDomain = true;
- }
+ parts = rurl.exec( s.url.toLowerCase() );
+ s.crossDomain = !!( parts &&
+ ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
+ ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
+ ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
+ );
}
// Convert data if not already a string
@@ -651,9 +644,9 @@ jQuery.extend( {
strAbort = "abort";
// Install callbacks on deferreds
- completeDeferred.add( s.complete );
- jqXHR.done( s.success );
- jqXHR.fail( s.error );
+ for ( i in { success: 1, error: 1, complete: 1 } ) {
+ jqXHR[ i ]( s[ i ] );
+ }
// Get transport
transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
diff --git a/test/unit/ajax.js b/test/unit/ajax.js
index 9abc5e613..d74909f88 100644
--- a/test/unit/ajax.js
+++ b/test/unit/ajax.js
@@ -374,7 +374,7 @@ QUnit.module( "ajax", {
];
} );
- ajaxTest( "jQuery.ajax() - cross-domain detection", 8, function( assert ) {
+ ajaxTest( "jQuery.ajax() - cross-domain detection", 7, function( assert ) {
function request( url, title, crossDomainOrOptions ) {
return jQuery.extend( {
dataType: "jsonp",
@@ -424,10 +424,6 @@ QUnit.module( "ajax", {
{
crossDomain: true
}
- ),
- request(
- " http://otherdomain.com",
- "Cross-domain url with leading space is detected as cross-domain"
)
];
} );