Skip to content

Commit 6ebaf87

Browse files
committed
fix: avoid merging Set-Cookie headers in WrapHandler
1 parent c3f5591 commit 6ebaf87

2 files changed

Lines changed: 32 additions & 1 deletion

File tree

lib/handler/wrap-handler.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,13 @@ module.exports = class WrapHandler {
6262
onResponseStart (controller, statusCode, headers, statusMessage) {
6363
const rawHeaders = []
6464
for (const [key, val] of Object.entries(headers)) {
65-
rawHeaders.push(Buffer.from(key), Array.isArray(val) ? val.map(v => Buffer.from(v)) : Buffer.from(val))
65+
if (Array.isArray(val) && key === 'set-cookie') {
66+
for (const v of val) {
67+
rawHeaders.push(Buffer.from(key), Buffer.from(v))
68+
}
69+
} else {
70+
rawHeaders.push(Buffer.from(key), Array.isArray(val) ? val.map(v => Buffer.from(v)) : Buffer.from(val))
71+
}
6672
}
6773

6874
if (this.#handler.onHeaders?.(statusCode, rawHeaders, () => controller.resume(), statusMessage) === false) {

test/issue-4389.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
const { test } = require('node:test')
2+
const assert = require('node:assert')
3+
const { once } = require('node:events')
4+
const { createServer } = require('node:http')
5+
const { fetch, Agent } = require('..')
6+
7+
test('Interceptor should not break Set-Cookie', async (t) => {
8+
const server = createServer({ joinDuplicateHeaders: true }, async (_req, res) => {
9+
const headers = [
10+
['set-cookie', 'a=1'],
11+
['set-cookie', 'b=2'],
12+
['set-cookie', 'c=3']
13+
]
14+
res.writeHead(200, headers)
15+
res.end()
16+
}).listen(0)
17+
18+
await once(server, 'listening')
19+
t.after(() => server.close())
20+
21+
const dispatcher = new Agent().compose((dispatch) => dispatch)
22+
23+
const { headers } = await fetch(`http://localhost:${server.address().port}`, { dispatcher })
24+
assert.deepStrictEqual(headers.getSetCookie(), ['a=1', 'b=2', 'c=3'])
25+
})

0 commit comments

Comments
 (0)