Skip to content

Commit

Permalink
Ajax: fix responseUrl to starts with undefined value
Browse files Browse the repository at this point in the history
  • Loading branch information
csmadhav committed Dec 18, 2019
1 parent 8ad9961 commit 25cee2d
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 36 deletions.
4 changes: 1 addition & 3 deletions src/ajax.js
Original file line number Diff line number Diff line change
Expand Up @@ -447,8 +447,6 @@ jQuery.extend( {
jqXHR = {
readyState: 0,

responseURL: "",

// Builds headers hashtable if needed
getResponseHeader: function( key ) {
var match;
Expand Down Expand Up @@ -713,7 +711,7 @@ jQuery.extend( {
}

// Callback for when everything is done
function done( status, nativeStatusText, responseURL, responses, headers ) {
function done( status, nativeStatusText, responses, headers, responseURL ) {
var isSuccess, success, error, response, modified,
statusText = nativeStatusText;

Expand Down
2 changes: 1 addition & 1 deletion src/ajax/script.js
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ jQuery.ajaxTransport( "script", function( s ) {
script.remove();
callback = null;
if ( evt ) {
complete( evt.type === "error" ? 404 : 200, evt.type, "" );
complete( evt.type === "error" ? 404 : 200, evt.type );
}
} );

Expand Down
11 changes: 4 additions & 7 deletions src/ajax/xhr.js
Original file line number Diff line number Diff line change
Expand Up @@ -68,20 +68,17 @@ jQuery.ajaxTransport( function( options ) {

// File: protocol always yields status 0; see #8605, #14207
xhr.status,
xhr.statusText,
""
xhr.statusText
);
} else {
complete(
xhrSuccessStatus[ xhr.status ] || xhr.status,
xhr.statusText,
xhr.responseURL,

// For XHR2 non-text, let the caller handle it (gh-2498)
xhr.statusText, // For XHR2 non-text, let the caller handle it (gh-2498)
( xhr.responseType || "text" ) === "text" ?
{ text: xhr.responseText } :
{ binary: xhr.response },
xhr.getAllResponseHeaders()
xhr.getAllResponseHeaders(),
xhr.responseURL
);
}
}
Expand Down
45 changes: 20 additions & 25 deletions test/unit/ajax.js
Original file line number Diff line number Diff line change
Expand Up @@ -1530,22 +1530,17 @@ QUnit.module( "ajax", {
// Example:
// Input: http://localhost:9876/base/test/data/testinit.js/../../../test/data/mock.php?action=responseURL&155821644568982930
// Output: http://localhost:9876/base/test/data/mock.php?action=responseURL&155821644568982930
function removeRelativePathComponents( url ) {
var reg = RegExp( "(\\.\\.\\/)+" ), match;
match = reg.exec( url );
var count = ( match[ 0 ].match( /\.\.\//g ) || [] ).length, cleaned;
var splits = url.substring( 0, match.index ).split( "/" );
cleaned = splits.slice( 0, splits.length - count - 1 ).join( "/" );
url = cleaned + url.substring( match.index + match[ 0 ].length - 1 );
if ( ( url.match( /\.\.\//g ) || [] ).length !== 0 ) {
url = removeRelativePathComponents( url );
}
return url;
function normalizeUrl( url ) {
var finalUrl = url;
while ( finalUrl.indexOf( "/../" ) > -1 ) {
finalUrl = finalUrl.replace( /\/[^/]+\/\.\.\//g, "/" );
}
return finalUrl;
}

var successURL = removeRelativePathComponents( url( "mock.php?action=responseURL" ) ),
var successURL = url( "mock.php?action=responseURL" ),
errorURL = "http://example.invalid",
redirectAndSuccessURL = url( "mock.php?action=responseURL" ) + "&url=" + encodeURIComponent( successURL ),
redirectAndSuccessURL = url( "mock.php?action=responseURL&url=" + encodeURIComponent( successURL ) ),
redirectAndErrorURL = url( "mock.php?action=responseURL&url=" + encodeURIComponent( errorURL ) ),
jsonpURL = baseURL + "mock.php?action=jsonp&callback=?",
scriptURL = url( "mock.php?action=testbar" );
Expand All @@ -1554,48 +1549,48 @@ QUnit.module( "ajax", {
{
url: successURL,
beforeSend: function( jqXHR ) {
assert.strictEqual( jqXHR.responseURL, "", "jqXHR responseURL ok before sending request" );
assert.strictEqual( jqXHR.responseURL, undefined, "jqXHR responseURL ok before sending request" );
},
success: function( _, __, jqXHR ) {
assert.strictEqual( jqXHR.responseURL, successURL, "jqXHR responseURL ok for success" );
assert.strictEqual( jqXHR.responseURL, normalizeUrl( successURL ), "jqXHR responseURL ok for success" );
}
},
{
url: errorURL,
beforeSend: function( jqXHR ) {
assert.strictEqual( jqXHR.responseURL, "", "jqXHR responseURL ok before sending request" );
assert.strictEqual( jqXHR.responseURL, undefined, "jqXHR responseURL ok before sending request" );
},
fail: function( jqXHR ) {
assert.strictEqual( jqXHR.responseURL, "", "jqXHR responseURL ok for error" );
assert.strictEqual( jqXHR.responseURL, undefined, "jqXHR responseURL ok for error" );
}
},
{
url: redirectAndSuccessURL,
beforeSend: function( jqXHR ) {
assert.strictEqual( jqXHR.responseURL, "", "jqXHR responseURL ok before sending request" );
assert.strictEqual( jqXHR.responseURL, undefined, "jqXHR responseURL ok before sending request" );
},
success: function( _, __, jqXHR ) {
assert.strictEqual( jqXHR.responseURL, successURL, "jqXHR responseURL ok for redirect success" );
assert.strictEqual( jqXHR.responseURL, normalizeUrl( successURL ), "jqXHR responseURL ok for redirect success" );
}
},
{
url: redirectAndErrorURL,
beforeSend: function( jqXHR ) {
assert.strictEqual( jqXHR.responseURL, "", "jqXHR responseURL ok before sending request" );
assert.strictEqual( jqXHR.responseURL, undefined, "jqXHR responseURL ok before sending request" );
},
fail: function( jqXHR ) {
assert.strictEqual( jqXHR.responseURL, "", "jqXHR responseURL ok for redirect error" );
assert.strictEqual( jqXHR.responseURL, undefined, "jqXHR responseURL ok for redirect error" );
}
},
{
url: jsonpURL,
dataType: "jsonp",
crossDomain: true,
beforeSend: function( jqXHR ) {
assert.strictEqual( jqXHR.responseURL, "", "jqXHR responseURL ok before sending request" );
assert.strictEqual( jqXHR.responseURL, undefined, "jqXHR responseURL ok before sending request" );
},
success: function( _, __, jqXHR ) {
assert.strictEqual( jqXHR.responseURL, "", "jqXHR responseURL ok for JSONP" );
assert.strictEqual( jqXHR.responseURL, undefined, "jqXHR responseURL ok for JSONP" );
}
},
{
Expand All @@ -1606,10 +1601,10 @@ QUnit.module( "ajax", {
dataType: "script",
crossDomain: true,
beforeSend: function( jqXHR ) {
assert.strictEqual( jqXHR.responseURL, "", "jqXHR responseURL ok before sending request" );
assert.strictEqual( jqXHR.responseURL, undefined, "jqXHR responseURL ok before sending request" );
},
success: function( _, __, jqXHR ) {
assert.strictEqual( jqXHR.responseURL, "", "jqXHR responseURL ok for script" );
assert.strictEqual( jqXHR.responseURL, undefined, "jqXHR responseURL ok for script" );
}
}
];
Expand Down

0 comments on commit 25cee2d

Please sign in to comment.