Skip to content

Commit c8da9b1

Browse files
authored
fix: merges headers safely in nextjs route handlers (#7399)
## Description Merges headers safely within Payload-handled Next.js route handlers.
1 parent 2021028 commit c8da9b1

File tree

3 files changed

+42
-38
lines changed

3 files changed

+42
-38
lines changed

packages/next/src/routes/graphql/handler.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -134,12 +134,8 @@ export const POST =
134134
resHeaders.append(key, headers[key])
135135
}
136136

137-
if (req.responseHeaders) {
138-
mergeHeaders(req.responseHeaders, resHeaders)
139-
}
140-
141137
return new Response(apiResponse.body, {
142-
headers: resHeaders,
138+
headers: req.responseHeaders ? mergeHeaders(req.responseHeaders, resHeaders) : resHeaders,
143139
status: apiResponse.status,
144140
})
145141
}

packages/next/src/routes/rest/index.ts

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,13 @@ const handleCustomEndpoints = async ({
167167

168168
if (res instanceof Response) {
169169
if (req.responseHeaders) {
170-
mergeHeaders(req.responseHeaders, res.headers)
170+
const mergedResponse = new Response(res.body, {
171+
headers: mergeHeaders(req.responseHeaders, res.headers),
172+
status: res.status,
173+
statusText: res.statusText,
174+
})
175+
176+
return mergedResponse
171177
}
172178

173179
return res
@@ -379,7 +385,13 @@ export const GET =
379385

380386
if (res instanceof Response) {
381387
if (req.responseHeaders) {
382-
mergeHeaders(req.responseHeaders, res.headers)
388+
const mergedResponse = new Response(res.body, {
389+
headers: mergeHeaders(req.responseHeaders, res.headers),
390+
status: res.status,
391+
statusText: res.statusText,
392+
})
393+
394+
return mergedResponse
383395
}
384396

385397
return res
@@ -555,7 +567,13 @@ export const POST =
555567

556568
if (res instanceof Response) {
557569
if (req.responseHeaders) {
558-
mergeHeaders(req.responseHeaders, res.headers)
570+
const mergedResponse = new Response(res.body, {
571+
headers: mergeHeaders(req.responseHeaders, res.headers),
572+
status: res.status,
573+
statusText: res.statusText,
574+
})
575+
576+
return mergedResponse
559577
}
560578

561579
return res
@@ -643,7 +661,13 @@ export const DELETE =
643661

644662
if (res instanceof Response) {
645663
if (req.responseHeaders) {
646-
mergeHeaders(req.responseHeaders, res.headers)
664+
const mergedResponse = new Response(res.body, {
665+
headers: mergeHeaders(req.responseHeaders, res.headers),
666+
status: res.status,
667+
statusText: res.statusText,
668+
})
669+
670+
return mergedResponse
647671
}
648672

649673
return res
@@ -732,7 +756,13 @@ export const PATCH =
732756

733757
if (res instanceof Response) {
734758
if (req.responseHeaders) {
735-
mergeHeaders(req.responseHeaders, res.headers)
759+
const mergedResponse = new Response(res.body, {
760+
headers: mergeHeaders(req.responseHeaders, res.headers),
761+
status: res.status,
762+
statusText: res.statusText,
763+
})
764+
765+
return mergedResponse
736766
}
737767

738768
return res
Lines changed: 6 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,11 @@
1-
const headersToJoin = ['set-cookie', 'warning', 'www-authenticate', 'proxy-authenticate', 'vary']
1+
export const mergeHeaders = (sourceHeaders: Headers, destinationHeaders: Headers): Headers => {
2+
// Create a new Headers object
3+
const combinedHeaders = new Headers(destinationHeaders)
24

3-
export function mergeHeaders(sourceHeaders: Headers, destinationHeaders: Headers): void {
4-
// Create a map to store combined headers
5-
const combinedHeaders = new Headers()
6-
7-
// Add existing destination headers to the combined map
8-
destinationHeaders.forEach((value, key) => {
9-
combinedHeaders.set(key, value)
10-
})
11-
12-
// Add source headers to the combined map, joining specific headers
5+
// Append sourceHeaders to combinedHeaders
136
sourceHeaders.forEach((value, key) => {
14-
const lowerKey = key.toLowerCase()
15-
if (headersToJoin.includes(lowerKey)) {
16-
if (combinedHeaders.has(key)) {
17-
combinedHeaders.set(key, `${combinedHeaders.get(key)}, ${value}`)
18-
} else {
19-
combinedHeaders.set(key, value)
20-
}
21-
} else {
22-
combinedHeaders.set(key, value)
23-
}
7+
combinedHeaders.append(key, value)
248
})
259

26-
// Clear the destination headers and set the combined headers
27-
destinationHeaders.forEach((_, key) => {
28-
destinationHeaders.delete(key)
29-
})
30-
combinedHeaders.forEach((value, key) => {
31-
destinationHeaders.append(key, value)
32-
})
10+
return combinedHeaders
3311
}

0 commit comments

Comments
 (0)