Fixes #7465. Reworked the regexp and associated test for cross-domain detection so...
authorjaubourg <j@ubourg.net>
Sun, 9 Jan 2011 05:01:00 +0000 (06:01 +0100)
committerjaubourg <j@ubourg.net>
Sun, 9 Jan 2011 05:01:00 +0000 (06:01 +0100)
src/ajax.js
test/unit/ajax.js

index 744476f..207ef13 100644 (file)
@@ -10,7 +10,7 @@ var r20 = /%20/g,
        rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
        rselectTextarea = /^(?:select|textarea)/i,
        rts = /([?&])_=[^&]*/,
-       rurl = /^(\w+:)?\/\/([^\/?#]+)/,
+       rurl = /^(\w+:)?\/\/([^\/?#:]+)(?::(\d+))?/,
 
        // Slice function
        sliceFunc = Array.prototype.slice,
@@ -520,7 +520,12 @@ jQuery.extend({
                // Determine if a cross-domain request is in order
                var parts = rurl.exec( s.url.toLowerCase() ),
                        loc = location;
-               s.crossDomain = !!( parts && ( parts[ 1 ] && parts[ 1 ] != loc.protocol || parts[ 2 ] != loc.host ) );
+               s.crossDomain = !!(
+                               parts &&
+                               ( parts[ 1 ] && parts[ 1 ] != loc.protocol ||
+                                       parts[ 2 ] != loc.hostname ||
+                                       ( parts[ 3 ] || 80 ) != ( loc.port || 80 ) )
+               );
 
                // Convert data if not already a string
                if ( s.data && s.processData && typeof s.data != "string" ) {
index adf589e..14f8928 100644 (file)
@@ -358,6 +358,58 @@ test(".ajax() - hash", function() {
        });
 });
 
+test("jQuery ajax - cross-domain detection", function() {
+
+       expect( 3 );
+
+       var loc = document.location,
+               otherPort = loc.port === 666 ? 667 : 666,
+               otherProtocol = loc.protocol === "http:" ? "https:" : "http:",
+               protocolFlag,
+               hostFlag,
+               portFlag;
+
+       if ( jQuery.ajax({
+               url: otherProtocol + "//" + loc.host,
+               beforeSend: function( _ , s ) {
+                       protocolFlag = 1;
+                       ok( s.crossDomain , "Test different protocols are detected as cross-domain" );
+                       return false;
+               }
+       }) === false ) {
+               if ( ! protocolFlag ) {
+                       ok( ! jQuery.support.cors , "Test different protocols are detected as cross-domain (no transport)" );
+               }
+       }
+
+       if ( jQuery.ajax({
+               url: loc.protocol + '//somewebsitethatdoesnotexist-656329477541.com:' + ( loc.port || 80 ),
+               beforeSend: function( _ , s ) {
+                       hostFlag = 1;
+                       ok( s.crossDomain , "Test different hostnames are detected as cross-domain" );
+                       return false;
+               }
+       }) === false ) {
+               if ( ! hostFlag ) {
+                       ok( ! jQuery.support.cors , "Test different hostnames are detected as cross-domain (no transport)" );
+               }
+       }
+
+       if ( jQuery.ajax({
+               url: loc.protocol + "//" + loc.hostname + ":" + otherPort,
+               beforeSend: function( _ , s ) {
+                       portFlag = 1;
+                       ok( s.crossDomain , "Test different ports are detected as cross-domain" );
+                       return false;
+               }
+       }) === false ) {
+               if ( ! portFlag ) {
+                       ok( ! jQuery.support.cors , "Test different ports are detected as cross-domain (no transport)" );
+               }
+       }
+
+});
+
 test(".ajax() - 304", function() {
        expect( 1 );
        stop();