diff --git a/src/utils.ts b/src/utils.ts index 73d80b6..ca5ccc0 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -92,27 +92,50 @@ 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) + 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) - if (key === 'set-cookie') - headers.append(key, setHeaders[key] as any) - else if (!responseHeaders.has(key)) + } 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) { + 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) + } + } + } return headers }