From f2e0ae1a3932d6089853e8c0eed6ecb446610c00 Mon Sep 17 00:00:00 2001 From: jaubourg Date: Fri, 11 Feb 2011 07:07:06 +0100 Subject: [PATCH] Fixes #8245. Ajax now ensures header names are capitalized so that non-compliant xhr implementations don't override them. --- src/ajax.js | 19 +++++++++++-------- src/ajax/xhr.js | 4 ++-- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/ajax.js b/src/ajax.js index 5a6ac26..b35952f 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -15,6 +15,7 @@ var r20 = /%20/g, rselectTextarea = /^(?:select|textarea)/i, rspacesAjax = /\s+/, rts = /([?&])_=[^&]*/, + rucWord = /(^|\-)([a-z])/g, rurl = /^([\w\+\.\-]+:)\/\/([^\/?#:]*)(?::(\d+))?/, // Keep a copy of the old load method @@ -400,8 +401,10 @@ jQuery.extend({ // Caches the header setRequestHeader: function( name, value ) { - if ( state === 0 ) { - requestHeaders[ name.toLowerCase() ] = value; + if ( !state ) { + requestHeaders[ name.toLowerCase().replace( rucWord, function( _, $1, $2 ) { + return $1 + $2.toUpperCase(); + } ) ] = value; } return this; }, @@ -428,7 +431,7 @@ jQuery.extend({ // Overrides response content-type header overrideMimeType: function( type ) { - if ( state === 0 ) { + if ( !state ) { s.mimeType = type; } return this; @@ -649,28 +652,28 @@ jQuery.extend({ // Set the correct header, if data is being sent if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - requestHeaders[ "content-type" ] = s.contentType; + requestHeaders[ "Content-Type" ] = s.contentType; } // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. if ( s.ifModified ) { ifModifiedKey = ifModifiedKey || s.url; if ( jQuery.lastModified[ ifModifiedKey ] ) { - requestHeaders[ "if-modified-since" ] = jQuery.lastModified[ ifModifiedKey ]; + requestHeaders[ "If-Modified-Since" ] = jQuery.lastModified[ ifModifiedKey ]; } if ( jQuery.etag[ ifModifiedKey ] ) { - requestHeaders[ "if-none-match" ] = jQuery.etag[ ifModifiedKey ]; + requestHeaders[ "If-None-Match" ] = jQuery.etag[ ifModifiedKey ]; } } // Set the Accepts header for the server, depending on the dataType - requestHeaders.accept = s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ? + requestHeaders.Accept = s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ? s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", */*; q=0.01" : "" ) : s.accepts[ "*" ]; // Check for headers option for ( i in s.headers ) { - requestHeaders[ i.toLowerCase() ] = s.headers[ i ]; + jqXHR.setRequestHeader( i, s.headers[ i ] ); } // Allow custom headers/mimetypes and early abort diff --git a/src/ajax/xhr.js b/src/ajax/xhr.js index c48ac90..e21847a 100644 --- a/src/ajax/xhr.js +++ b/src/ajax/xhr.js @@ -96,8 +96,8 @@ if ( jQuery.support.ajax ) { // Not set for crossDomain requests with no content // (see why at http://trac.dojotoolkit.org/ticket/9486) // Won't change header if already provided - if ( !( s.crossDomain && !s.hasContent ) && !headers["x-requested-with"] ) { - headers[ "x-requested-with" ] = "XMLHttpRequest"; + if ( !( s.crossDomain && !s.hasContent ) && !headers["X-Requested-With"] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; } // Need an extra try/catch for cross domain requests in Firefox 3 -- 1.7.10.4