Ajax: Overwrite s.contentType with content-type header value, if any

This fixes the issue of "%20" in POST data being replaced with "+"
even for requests with content-type different from
"application/x-www-form-urlencoded", e.g. for "application/json".

Fixes gh-4119
Closes gh-4650

(cherry picked from 7fb90a6bea)

Co-authored-by: Richard Gibson <richard.gibson@gmail.com>
Co-authored-by: Michał Gołębiowski-Owczarek <m.goleb@gmail.com>
This commit is contained in:
Christian Wenz 2020-04-06 21:15:55 +02:00 committed by Michał Gołębiowski-Owczarek
parent 1a4f10ddc3
commit 065143c2e9
2 changed files with 55 additions and 0 deletions

View File

@ -855,5 +855,14 @@ jQuery.each( [ "get", "post" ], function( _i, method ) {
};
} );
jQuery.ajaxPrefilter( function( s ) {
var i;
for ( i in s.headers ) {
if ( i.toLowerCase() === "content-type" ) {
s.contentType = s.headers[ i ] || "";
}
}
} );
return jQuery;
} );

View File

@ -1326,6 +1326,52 @@ QUnit.module( "ajax", {
};
} );
ajaxTest( "jQuery.ajax() - don't escape %20 with contentType override (gh-4119)", 1, function( assert ) {
return {
url: "bogus.html",
contentType: "application/x-www-form-urlencoded",
headers: { "content-type": "application/json" },
method: "post",
dataType: "json",
data: "{\"val\":\"%20\"}",
beforeSend: function( _, s ) {
assert.strictEqual( s.data, "{\"val\":\"%20\"}", "data is not %20-encoded" );
return false;
},
error: true
};
} );
ajaxTest( "jQuery.ajax() - escape %20 with contentType override (gh-4119)", 1, function( assert ) {
return {
url: "bogus.html",
contentType: "application/json",
headers: { "content-type": "application/x-www-form-urlencoded" },
method: "post",
dataType: "json",
data: "{\"val\":\"%20\"}",
beforeSend: function( _, s ) {
assert.strictEqual( s.data, "{\"val\":\"+\"}", "data is %20-encoded" );
return false;
},
error: true
};
} );
ajaxTest( "jQuery.ajax() - override contentType with header (gh-4119)", 1, function( assert ) {
return {
url: "bogus.html",
contentType: "application/json",
headers: { "content-type": "application/x-www-form-urlencoded" },
beforeSend: function( _, s ) {
assert.strictEqual( s.contentType, "application/x-www-form-urlencoded",
"contentType is overwritten" );
return false;
},
error: true
};
} );
ajaxTest( "jQuery.ajax() - data - no processing POST", 1, function( assert ) {
return {
url: "bogus.html",