Skip to content

Commit 0dcd59b

Browse files
authored
fix: keep raw header name (#3183)
* fix: keep raw header name * fixup * Apply suggestions from code review * Apply suggestions from code review * Apply suggestions from code review * Apply suggestions from code review * Apply suggestions from code review * Apply suggestions from code review
1 parent e9a2cf5 commit 0dcd59b

File tree

3 files changed

+15
-10
lines changed

3 files changed

+15
-10
lines changed

lib/web/fetch/headers.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ class HeadersList {
250250
get entries () {
251251
const headers = {}
252252

253-
if (this[kHeadersMap].size) {
253+
if (this[kHeadersMap].size !== 0) {
254254
for (const { name, value } of this[kHeadersMap].values()) {
255255
headers[name] = value
256256
}
@@ -259,6 +259,10 @@ class HeadersList {
259259
return headers
260260
}
261261

262+
rawValues () {
263+
return this[kHeadersMap].values()
264+
}
265+
262266
get entriesList () {
263267
const headers = []
264268

lib/web/fetch/request.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -477,9 +477,8 @@ class Request {
477477
// 4. If headers is a Headers object, then for each header in its header
478478
// list, append header’s name/header’s value to this’s headers.
479479
if (headers instanceof HeadersList) {
480-
for (const { 0: key, 1: val } of headers) {
481-
// Note: The header names are already in lowercase.
482-
headersList.append(key, val, true)
480+
for (const { name, value } of headers.rawValues()) {
481+
headersList.append(name, value, false)
483482
}
484483
// Note: Copy the `set-cookie` meta-data.
485484
headersList.cookies = headers.cookies

test/fetch/headers-case.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,32 @@
11
'use strict'
22

3-
const { fetch, Headers } = require('../..')
3+
const { fetch, Headers, Request } = require('../..')
44
const { createServer } = require('node:http')
55
const { once } = require('node:events')
66
const { test } = require('node:test')
77
const { tspl } = require('@matteo.collina/tspl')
8+
const { closeServerAsPromise } = require('../utils/node-http')
89

910
test('Headers retain keys case-sensitive', async (t) => {
10-
const assert = tspl(t, { plan: 3 })
11+
const assert = tspl(t, { plan: 4 })
1112

1213
const server = createServer((req, res) => {
1314
assert.ok(req.rawHeaders.includes('Content-Type'))
1415

1516
res.end()
1617
}).listen(0)
1718

18-
t.after(() => server.close())
19+
t.after(closeServerAsPromise(server))
1920
await once(server, 'listening')
2021

22+
const url = `http://localhost:${server.address().port}`
2123
for (const headers of [
2224
new Headers([['Content-Type', 'text/plain']]),
2325
{ 'Content-Type': 'text/plain' },
2426
[['Content-Type', 'text/plain']]
2527
]) {
26-
await fetch(`http://localhost:${server.address().port}`, {
27-
headers
28-
})
28+
await fetch(url, { headers })
2929
}
30+
// see https://github.com/nodejs/undici/pull/3183
31+
await fetch(new Request(url, { headers: [['Content-Type', 'text/plain']] }), { method: 'GET' })
3032
})

0 commit comments

Comments
 (0)