From e02949ea8eda2c87aed4d4bb488012b2954df26c Mon Sep 17 00:00:00 2001 From: Codex Date: Sun, 5 Apr 2026 00:55:22 +0100 Subject: [PATCH 1/3] fix: preserve multiple set-cookie headers --- src/utils.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/utils.ts b/src/utils.ts index 73d80b6..4742838 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -92,8 +92,15 @@ export function mergeHeaders( responseHeaders: Headers, setHeaders: Context['set']['headers'] ) { - // @ts-ignore - const headers = new Headers(Object.fromEntries(responseHeaders.entries())) + const headers = new Headers() + + for (const [key, value] of responseHeaders.entries()) { + if (key === 'set-cookie') continue + headers.append(key, value) + } + + for (const cookie of responseHeaders.getSetCookie()) + headers.append('set-cookie', cookie) // Merge headers: Response headers take precedence, set.headers fill in non-conflicting ones if (setHeaders instanceof Headers) From 455fc1fd8c0b49ed908caad52a6357eab68cb41a Mon Sep 17 00:00:00 2001 From: "Mario P." Date: Sun, 5 Apr 2026 01:07:35 +0100 Subject: [PATCH 2/3] fix: handle object set-cookie headers consistently --- src/utils.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/utils.ts b/src/utils.ts index 4742838..2506c67 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -116,8 +116,16 @@ export function mergeHeaders( } else for (const key in setHeaders) - if (key === 'set-cookie') - headers.append(key, setHeaders[key] as any) + if (key === 'set-cookie') { + if (headers.has('set-cookie')) continue + + const cookies = setHeaders[key] + + if (Array.isArray(cookies)) + for (const cookie of cookies) + headers.append('set-cookie', cookie) + else headers.append('set-cookie', cookies as string) + } else if (!responseHeaders.has(key)) headers.set(key, setHeaders[key] as any) From 392f08cab234871c2d7b087fd08e33dd19b45e6c Mon Sep 17 00:00:00 2001 From: "Mario P." Date: Sun, 5 Apr 2026 01:08:31 +0100 Subject: [PATCH 3/3] style: add explicit blocks in mergeHeaders --- src/utils.ts | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/utils.ts b/src/utils.ts index 2506c67..ca5ccc0 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -99,35 +99,43 @@ export function mergeHeaders( headers.append(key, value) } - for (const cookie of responseHeaders.getSetCookie()) + for (const cookie of responseHeaders.getSetCookie()) { headers.append('set-cookie', cookie) + } // Merge headers: Response headers take precedence, set.headers fill in non-conflicting ones - if (setHeaders instanceof Headers) + if (setHeaders instanceof Headers) { // @ts-ignore for (const key of setHeaders.keys()) { if (key === 'set-cookie') { if (headers.has('set-cookie')) continue - for (const cookie of setHeaders.getSetCookie()) + for (const cookie of setHeaders.getSetCookie()) { headers.append('set-cookie', cookie) - } else if (!responseHeaders.has(key)) + } + } else if (!responseHeaders.has(key)) { headers.set(key, setHeaders?.get(key) ?? '') + } } - else - for (const key in setHeaders) + } else { + for (const key in setHeaders) { if (key === 'set-cookie') { if (headers.has('set-cookie')) continue const cookies = setHeaders[key] - if (Array.isArray(cookies)) - for (const cookie of cookies) + if (Array.isArray(cookies)) { + for (const cookie of cookies) { headers.append('set-cookie', cookie) - else headers.append('set-cookie', cookies as string) - } - else if (!responseHeaders.has(key)) + } + } else { + headers.append('set-cookie', cookies as string) + } + } else if (!responseHeaders.has(key)) { headers.set(key, setHeaders[key] as any) + } + } + } return headers }