From 7f19790da0a5bc86e81a364d45436b4b69264b6e Mon Sep 17 00:00:00 2001 From: Phil Pluckthun Date: Mon, 16 Feb 2026 02:48:41 +0000 Subject: [PATCH] fix: Drop `setHeaders` call for consistent `setHeader` calls (#35) --- .changeset/loud-ideas-type.md | 5 +++++ src/fetch.ts | 19 +++++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 .changeset/loud-ideas-type.md diff --git a/.changeset/loud-ideas-type.md b/.changeset/loud-ideas-type.md new file mode 100644 index 0000000..42460a2 --- /dev/null +++ b/.changeset/loud-ideas-type.md @@ -0,0 +1,5 @@ +--- +'fetch-nodeshim': patch +--- + +Avoid `setHeaders` to increase consistency, fix `Set-Cookie` case for older Node versions, and work around bug in Bun <=1.3.9 diff --git a/src/fetch.ts b/src/fetch.ts index 3d5c323..a352eac 100644 --- a/src/fetch.ts +++ b/src/fetch.ts @@ -33,10 +33,21 @@ const assignOutgoingMessageHeaders = ( outgoing: http.OutgoingMessage, headers: Headers ) => { - if (typeof outgoing.setHeaders === 'function') { - outgoing.setHeaders(headers); - } else { - for (const [key, value] of headers) outgoing.setHeader(key, value); + // Preassemble array headers, mostly only for Set-Cookie + // We're avoiding `getSetCookie` since support is unclear in Node 18 + const collection: Record = {}; + for (const [key, value] of headers) { + if (Array.isArray(collection[key])) { + collection[key].push(value); + } else if (collection[key] != undefined) { + collection[key] = [collection[key], value]; + } else { + collection[key] = value; + } + } + // We don't use `setHeaders` due to a Bun bug (Fix: https://github.com/oven-sh/bun/pull/27050) + for (const key in collection) { + outgoing.setHeader(key, collection[key]); } }; -- 2.51.2