diff --git a/src/ng/http.js b/src/ng/http.js index 5fdc1a18a77c..d9813663b861 100644 --- a/src/ng/http.js +++ b/src/ng/http.js @@ -482,17 +482,40 @@ function $HttpProvider() { var reqTransformFn = config.transformRequest || $config.transformRequest, respTransformFn = config.transformResponse || $config.transformResponse, - defHeaders = $config.headers, - reqHeaders = extend({'X-XSRF-TOKEN': $browser.cookies()['XSRF-TOKEN']}, - defHeaders.common, defHeaders[lowercase(config.method)], config.headers), - reqData = transformData(config.data, headersGetter(reqHeaders), reqTransformFn), + reqHeaders = extend({}, config.headers), + defHeaders = extend( + {'X-XSRF-TOKEN': $browser.cookies()['XSRF-TOKEN']}, + $config.headers.common, + $config.headers[lowercase(config.method)] + ), + reqData, + defHeaderName, lowercaseDefHeaderName, headerName, promise; + // using for-in instead of forEach to avoid unecessary iteration after header has been found + defaultHeadersIteration: + for(defHeaderName in defHeaders) { + lowercaseDefHeaderName = lowercase(defHeaderName); + for(headerName in config.headers) { + if (lowercase(headerName) === lowercaseDefHeaderName) { + continue defaultHeadersIteration; + } + } + reqHeaders[defHeaderName] = defHeaders[defHeaderName]; + } + // strip content-type if data is undefined if (isUndefined(config.data)) { - delete reqHeaders['Content-Type']; + for(var header in reqHeaders) { + if (lowercase(header) === 'content-type') { + delete reqHeaders[header]; + break; + } + } } + reqData = transformData(config.data, headersGetter(reqHeaders), reqTransformFn); + // send request promise = sendReq(config, reqData, reqHeaders); diff --git a/test/ng/httpSpec.js b/test/ng/httpSpec.js index bb4de3c1a5e2..18be582633a2 100644 --- a/test/ng/httpSpec.js +++ b/test/ng/httpSpec.js @@ -430,6 +430,21 @@ describe('$http', function() { }); + it('should override default headers with custom in a case insensitive manner', function() { + $httpBackend.expect('POST', '/url', 'messageBody', function(headers) { + return headers['accept'] == 'Rewritten' && + headers['content-type'] == 'Content-Type Rewritten' && + headers['Accept'] === undefined && + headers['Content-Type'] === undefined; + }).respond(''); + + $http({url: '/url', method: 'POST', data: 'messageBody', headers: { + 'accept': 'Rewritten', + 'content-type': 'Content-Type Rewritten' + }}); + $httpBackend.flush(); + }); + it('should not send Content-Type header if request data/body is undefined', function() { $httpBackend.expect('POST', '/url', undefined, function(headers) { return !headers.hasOwnProperty('Content-Type');