Skip to content

Commit 94bc55f

Browse files
committed
Fixes request headers to conform to spec more closely.
I've made the request headers case insensitive for setting and getting by creating a mapping hash to map the insensitive names with the ones used in setting. I've also fixed setRequestHeader to append values to existing ones as per the spec. Because of this I needed to set the defaults on send if they haven't been set previously (user-agent obviously can't because it's in the restricted list).
1 parent 0bda0ae commit 94bc55f

File tree

1 file changed

+15
-6
lines changed

1 file changed

+15
-6
lines changed

lib/XMLHttpRequest.js

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ exports.XMLHttpRequest = function() {
4040
"Accept": "*/*",
4141
};
4242

43-
var headers = defaultHeaders;
43+
var headers = {};
44+
var headersCase = {};
4445

4546
// These headers are not user setable.
4647
// The following are allowed but banned in the spec:
@@ -177,7 +178,7 @@ exports.XMLHttpRequest = function() {
177178
};
178179

179180
/**
180-
* Sets a header for the request.
181+
* Sets a header for the request or appends the value if one is already set.
181182
*
182183
* @param string header Header name
183184
* @param string value Header value
@@ -193,7 +194,9 @@ exports.XMLHttpRequest = function() {
193194
if (sendFlag) {
194195
throw "INVALID_STATE_ERR: send flag is true";
195196
}
196-
headers[header] = value;
197+
header = headersCase[header.toLowerCase()] || header;
198+
headersCase[header.toLowerCase()] = header;
199+
headers[header] = headers[header] ? headers[header] + ', ' + value : value;
197200
};
198201

199202
/**
@@ -243,9 +246,8 @@ exports.XMLHttpRequest = function() {
243246
* @return string Returns the request header or empty string if not set
244247
*/
245248
this.getRequestHeader = function(name) {
246-
// @TODO Make this case insensitive
247-
if (typeof name === "string" && headers[name]) {
248-
return headers[name];
249+
if (typeof name === "string" && headersCase[name.toLowerCase()]) {
250+
return headers[headersCase[name.toLowerCase()]];
249251
}
250252

251253
return "";
@@ -325,6 +327,13 @@ exports.XMLHttpRequest = function() {
325327
// Add query string if one is used
326328
var uri = url.pathname + (url.search ? url.search : '');
327329

330+
// Set the defaults if they haven't been set
331+
for (var name in defaultHeaders) {
332+
if (!headersCase[name.toLowerCase()]) {
333+
headers[name] = defaultHeaders[name];
334+
}
335+
}
336+
328337
// Set the Host header or the server may reject the request
329338
headers["Host"] = host;
330339
if (!((ssl && port === 443) || port === 80)) {

0 commit comments

Comments
 (0)