]> source.dussan.org Git - jquery.git/commitdiff
Ajax: Overwrite s.contentType with content-type header value, if any
authorChristian Wenz <christian@wenz.org>
Mon, 6 Apr 2020 19:15:55 +0000 (21:15 +0200)
committerMichał Gołębiowski-Owczarek <m.goleb@gmail.com>
Mon, 6 Apr 2020 19:19:25 +0000 (21:19 +0200)
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 7fb90a6beaeffe16699800f73746748f6a5cc2de)

Co-authored-by: Richard Gibson <richard.gibson@gmail.com>
Co-authored-by: Michał Gołębiowski-Owczarek <m.goleb@gmail.com>
src/ajax.js
test/unit/ajax.js

index 639a6a3807b2aa43ce9364187c4b07b3ac3785e0..7e8f552aacd14043f21bb3de10b598084853fdd1 100644 (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;
 } );
index b91ef6711b3bb4744cbdb2fadd853ac9e13a9f31..d9b984799cf5ed80fd6deb9ee7a1869d8181a25d 100644 (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",