Skip to content

Commit 172eb41

Browse files
committed
✨ support duplicate headers
1 parent c6e3849 commit 172eb41

File tree

2 files changed

+81
-3
lines changed

2 files changed

+81
-3
lines changed

index.js

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@
1313

1414
module.exports = onHeaders
1515

16+
var http = require('http')
17+
18+
// older node versions don't have appendHeader
19+
var isAppendHeaderSupported = typeof http.ServerResponse.prototype.appendHeader === 'function'
20+
1621
/**
1722
* Create a replacement writeHead method.
1823
*
@@ -80,13 +85,23 @@ function setHeadersFromArray (res, headers) {
8085
res.setHeader(headers[i][0], headers[i][1])
8186
}
8287
} else {
88+
// 1D
8389
if (headers.length % 2 !== 0) {
8490
throw new TypeError('headers array is malformed')
8591
}
8692

87-
// 1D
88-
for (var j = 0; j < headers.length; j += 2) {
89-
res.setHeader(headers[j], headers[j + 1])
93+
if (isAppendHeaderSupported) {
94+
for (var j = 0; j < headers.length; j += 2) {
95+
res.removeHeader(headers[j])
96+
}
97+
98+
for (var k = 0; k < headers.length; k += 2) {
99+
res.appendHeader(headers[k], headers[k + 1])
100+
}
101+
} else {
102+
for (var l = 0; l < headers.length; l += 2) {
103+
res.setHeader(headers[l], headers[l + 1])
104+
}
90105
}
91106
}
92107
}

test/test.js

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ var http = require('http')
44
var onHeaders = require('..')
55
var request = require('supertest')
66

7+
// older node versions don't have appendHeader
8+
var isAppendHeaderSupported = typeof http.ServerResponse.prototype.appendHeader === 'function'
9+
710
describe('onHeaders(res, listener)', function () {
811
it('should fire after setHeader', function (done) {
912
var server = createServer(echoListener)
@@ -336,6 +339,66 @@ describe('onHeaders(res, listener)', function () {
336339
.expect(500, done)
337340
})
338341
})
342+
343+
describe('writeHead(status, duplicate headers)', function () {
344+
it('should be respected', function (done) {
345+
var server = createServer(listener, handler)
346+
347+
function handler (req, res) {
348+
res.writeHead(201, ['express', 'is good', 'express', 'is great'])
349+
}
350+
351+
function listener (req, res) {
352+
// no need to duplicate existing listener tests further... right?
353+
}
354+
355+
var response = request(server).get('/')
356+
357+
if (isAppendHeaderSupported) {
358+
response
359+
.expect('express', 'is good, is great')
360+
} else {
361+
response
362+
.expect('express', 'is great')
363+
}
364+
365+
response
366+
.expect(201)
367+
.end(function (err, res) {
368+
if (err) throw err
369+
370+
var expressIsGood = false
371+
var expressIsGreat = false
372+
373+
// very old node versions do not have the `rawHeaders` prop
374+
var headers = res.res.rawHeaders || res.res.headers
375+
376+
if (headers.length) {
377+
for (var i = 0; i < headers.length; i++) {
378+
const header = headers[i]
379+
380+
if (header === 'express') {
381+
if (headers[i + 1] === 'is good') {
382+
expressIsGood = true
383+
} else if (headers[i + 1] === 'is great') {
384+
expressIsGreat = true
385+
}
386+
}
387+
}
388+
} else {
389+
expressIsGreat = headers.express === 'is great'
390+
}
391+
392+
if (isAppendHeaderSupported) {
393+
assert.ok(expressIsGood)
394+
}
395+
396+
assert.ok(expressIsGreat)
397+
398+
done()
399+
})
400+
})
401+
})
339402
})
340403

341404
function createServer (listener, handler) {

0 commit comments

Comments
 (0)