Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit 25d9f5a

Browse files
caiotoonpetebacondarwin
authored andcommitted
fix($http): ensure case-insens. header overriding
If user send content-type header, both content-type and default Content-Type headers were sent. Now default header overriding is case-insensitive.
1 parent 1b234cb commit 25d9f5a

File tree

2 files changed

+43
-5
lines changed

2 files changed

+43
-5
lines changed

src/ng/http.js

+28-5
Original file line numberDiff line numberDiff line change
@@ -482,17 +482,40 @@ function $HttpProvider() {
482482

483483
var reqTransformFn = config.transformRequest || $config.transformRequest,
484484
respTransformFn = config.transformResponse || $config.transformResponse,
485-
defHeaders = $config.headers,
486-
reqHeaders = extend({'X-XSRF-TOKEN': $browser.cookies()['XSRF-TOKEN']},
487-
defHeaders.common, defHeaders[lowercase(config.method)], config.headers),
488-
reqData = transformData(config.data, headersGetter(reqHeaders), reqTransformFn),
485+
reqHeaders = extend({}, config.headers),
486+
defHeaders = extend(
487+
{'X-XSRF-TOKEN': $browser.cookies()['XSRF-TOKEN']},
488+
$config.headers.common,
489+
$config.headers[lowercase(config.method)]
490+
),
491+
reqData,
492+
defHeaderName, lowercaseDefHeaderName, headerName,
489493
promise;
490494

495+
// using for-in instead of forEach to avoid unecessary iteration after header has been found
496+
defaultHeadersIteration:
497+
for(defHeaderName in defHeaders) {
498+
lowercaseDefHeaderName = lowercase(defHeaderName);
499+
for(headerName in config.headers) {
500+
if (lowercase(headerName) === lowercaseDefHeaderName) {
501+
continue defaultHeadersIteration;
502+
}
503+
}
504+
reqHeaders[defHeaderName] = defHeaders[defHeaderName];
505+
}
506+
491507
// strip content-type if data is undefined
492508
if (isUndefined(config.data)) {
493-
delete reqHeaders['Content-Type'];
509+
for(var header in reqHeaders) {
510+
if (lowercase(header) === 'content-type') {
511+
delete reqHeaders[header];
512+
break;
513+
}
514+
}
494515
}
495516

517+
reqData = transformData(config.data, headersGetter(reqHeaders), reqTransformFn);
518+
496519
// send request
497520
promise = sendReq(config, reqData, reqHeaders);
498521

test/ng/httpSpec.js

+15
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,21 @@ describe('$http', function() {
430430
});
431431

432432

433+
it('should override default headers with custom in a case insensitive manner', function() {
434+
$httpBackend.expect('POST', '/url', 'messageBody', function(headers) {
435+
return headers['accept'] == 'Rewritten' &&
436+
headers['content-type'] == 'Content-Type Rewritten' &&
437+
headers['Accept'] === undefined &&
438+
headers['Content-Type'] === undefined;
439+
}).respond('');
440+
441+
$http({url: '/url', method: 'POST', data: 'messageBody', headers: {
442+
'accept': 'Rewritten',
443+
'content-type': 'Content-Type Rewritten'
444+
}});
445+
$httpBackend.flush();
446+
});
447+
433448
it('should not send Content-Type header if request data/body is undefined', function() {
434449
$httpBackend.expect('POST', '/url', undefined, function(headers) {
435450
return !headers.hasOwnProperty('Content-Type');

0 commit comments

Comments
 (0)