Skip to content

Commit

Permalink
fix: keep raw header name (#3183)
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
tsctx committed May 1, 2024
1 parent e9a2cf5 commit 0dcd59b
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 10 deletions.
6 changes: 5 additions & 1 deletion lib/web/fetch/headers.js
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,7 @@ class HeadersList {
get entries () {
const headers = {}

if (this[kHeadersMap].size) {
if (this[kHeadersMap].size !== 0) {
for (const { name, value } of this[kHeadersMap].values()) {
headers[name] = value
}
Expand All @@ -259,6 +259,10 @@ class HeadersList {
return headers
}

rawValues () {
return this[kHeadersMap].values()
}

get entriesList () {
const headers = []

Expand Down
5 changes: 2 additions & 3 deletions lib/web/fetch/request.js
Original file line number Diff line number Diff line change
Expand Up @@ -477,9 +477,8 @@ class Request {
// 4. If headers is a Headers object, then for each header in its header
// list, append header’s name/header’s value to this’s headers.
if (headers instanceof HeadersList) {
for (const { 0: key, 1: val } of headers) {
// Note: The header names are already in lowercase.
headersList.append(key, val, true)
for (const { name, value } of headers.rawValues()) {
headersList.append(name, value, false)
}
// Note: Copy the `set-cookie` meta-data.
headersList.cookies = headers.cookies
Expand Down
14 changes: 8 additions & 6 deletions test/fetch/headers-case.js
Original file line number Diff line number Diff line change
@@ -1,30 +1,32 @@
'use strict'

const { fetch, Headers } = require('../..')
const { fetch, Headers, Request } = require('../..')
const { createServer } = require('node:http')
const { once } = require('node:events')
const { test } = require('node:test')
const { tspl } = require('@matteo.collina/tspl')
const { closeServerAsPromise } = require('../utils/node-http')

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

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

res.end()
}).listen(0)

t.after(() => server.close())
t.after(closeServerAsPromise(server))
await once(server, 'listening')

const url = `http://localhost:${server.address().port}`
for (const headers of [
new Headers([['Content-Type', 'text/plain']]),
{ 'Content-Type': 'text/plain' },
[['Content-Type', 'text/plain']]
]) {
await fetch(`http://localhost:${server.address().port}`, {
headers
})
await fetch(url, { headers })
}
// see https://github.com/nodejs/undici/pull/3183
await fetch(new Request(url, { headers: [['Content-Type', 'text/plain']] }), { method: 'GET' })
})

0 comments on commit 0dcd59b

Please sign in to comment.