Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 33 additions & 10 deletions src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down