Skip to content

Commit 554280a

Browse files
committed
Merge pull request #82 from jacwright/request-headers
Fixes request headers to conform to spec more closely.
2 parents 853745c + 4610298 commit 554280a

File tree

2 files changed

+19
-6
lines changed

2 files changed

+19
-6
lines changed

lib/XMLHttpRequest.js

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

45-
var headers = defaultHeaders;
45+
var headers = {};
46+
var headersCase = {};
4647

4748
// These headers are not user setable.
4849
// The following are allowed but banned in the spec:
@@ -183,7 +184,7 @@ exports.XMLHttpRequest = function() {
183184
};
184185

185186
/**
186-
* Sets a header for the request.
187+
* Sets a header for the request or appends the value if one is already set.
187188
*
188189
* @param string header Header name
189190
* @param string value Header value
@@ -199,7 +200,9 @@ exports.XMLHttpRequest = function() {
199200
if (sendFlag) {
200201
throw new Error("INVALID_STATE_ERR: send flag is true");
201202
}
202-
headers[header] = value;
203+
header = headersCase[header.toLowerCase()] || header;
204+
headersCase[header.toLowerCase()] = header;
205+
headers[header] = headers[header] ? headers[header] + ', ' + value : value;
203206
};
204207

205208
/**
@@ -249,9 +252,8 @@ exports.XMLHttpRequest = function() {
249252
* @return string Returns the request header or empty string if not set
250253
*/
251254
this.getRequestHeader = function(name) {
252-
// @TODO Make this case insensitive
253-
if (typeof name === "string" && headers[name]) {
254-
return headers[name];
255+
if (typeof name === "string" && headersCase[name.toLowerCase()]) {
256+
return headers[headersCase[name.toLowerCase()]];
255257
}
256258

257259
return "";
@@ -332,6 +334,13 @@ exports.XMLHttpRequest = function() {
332334
// Add query string if one is used
333335
var uri = url.pathname + (url.search ? url.search : "");
334336

337+
// Set the defaults if they haven't been set
338+
for (var name in defaultHeaders) {
339+
if (!headersCase[name.toLowerCase()]) {
340+
headers[name] = defaultHeaders[name];
341+
}
342+
}
343+
335344
// Set the Host header or the server may reject the request
336345
headers.Host = host;
337346
if (!((ssl && port === 443) || port === 80)) {

tests/test-headers.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,16 @@ try {
5656
xhr.open("GET", "http://localhost:8000/");
5757
// Valid header
5858
xhr.setRequestHeader("X-Test", "Foobar");
59+
xhr.setRequestHeader("X-Test2", "Foobar1");
60+
xhr.setRequestHeader("X-Test2", "Foobar2");
5961
// Invalid header
6062
xhr.setRequestHeader("Content-Length", 0);
6163
// Allowed header outside of specs
6264
xhr.setRequestHeader("user-agent", "node-XMLHttpRequest-test");
6365
// Test getRequestHeader
6466
assert.equal("Foobar", xhr.getRequestHeader("X-Test"));
67+
assert.equal("Foobar", xhr.getRequestHeader("x-tEST"));
68+
assert.equal("Foobar1, Foobar2", xhr.getRequestHeader("x-test2"));
6569
// Test invalid header
6670
assert.equal("", xhr.getRequestHeader("Content-Length"));
6771

0 commit comments

Comments
 (0)