Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 5489c0d

Browse files
authored
fix: address edge can read request body failures (#2890)
* fix: address edge can read request body failures * fix: apply multiple body reads patch to rewrite case
1 parent a9f4792 commit 5489c0d

File tree

1 file changed

+17
-19
lines changed

1 file changed

+17
-19
lines changed

edge-runtime/lib/response.ts

+17-19
Original file line numberDiff line numberDiff line change
@@ -163,25 +163,13 @@ export const buildResponse = async ({
163163

164164
if (rewriteUrl.origin !== baseUrl.origin) {
165165
logger.withFields({ rewrite_url: rewrite }).debug('Rewriting to external url')
166-
let proxyRequest: Request
166+
const proxyRequest = await cloneRequest(rewriteUrl, request)
167167

168168
// Remove Netlify internal headers
169-
const headers = new Headers(
170-
[...request.headers.entries()].filter(([key]) => !key.startsWith('x-nf-')),
171-
)
172-
if (request.body && !request.bodyUsed) {
173-
// This is not ideal, but streaming to an external URL doesn't work
174-
const body = await request.arrayBuffer()
175-
proxyRequest = new Request(rewriteUrl, {
176-
headers,
177-
method: request.method,
178-
body,
179-
})
180-
} else {
181-
proxyRequest = new Request(rewriteUrl, {
182-
headers,
183-
method: request.method,
184-
})
169+
for (const key of request.headers.keys()) {
170+
if (key.startsWith('x-nf-')) {
171+
proxyRequest.headers.delete(key)
172+
}
185173
}
186174

187175
return addMiddlewareHeaders(fetch(proxyRequest, { redirect: 'manual' }), edgeResponse)
@@ -207,7 +195,7 @@ export const buildResponse = async ({
207195
request.headers.set('x-middleware-rewrite', target)
208196

209197
// coookies set in middleware need to be available during the lambda request
210-
const newRequest = new Request(target, request)
198+
const newRequest = await cloneRequest(target, request)
211199
const newRequestCookies = mergeMiddlewareCookies(edgeResponse, newRequest)
212200
if (newRequestCookies) {
213201
newRequest.headers.set('Cookie', newRequestCookies)
@@ -241,7 +229,7 @@ export const buildResponse = async ({
241229
edgeResponse.headers.delete('x-middleware-next')
242230

243231
// coookies set in middleware need to be available during the lambda request
244-
const newRequest = new Request(request)
232+
const newRequest = await cloneRequest(request.url, request)
245233
const newRequestCookies = mergeMiddlewareCookies(edgeResponse, newRequest)
246234
if (newRequestCookies) {
247235
newRequest.headers.set('Cookie', newRequestCookies)
@@ -284,3 +272,13 @@ function normalizeLocalizedTarget({
284272
}
285273
return targetUrl.toString()
286274
}
275+
276+
async function cloneRequest(url, request: Request) {
277+
// This is not ideal, but streaming to an external URL doesn't work
278+
const body = request.body && !request.bodyUsed ? await request.arrayBuffer() : undefined
279+
return new Request(url, {
280+
headers: request.headers,
281+
method: request.method,
282+
body,
283+
})
284+
}

0 commit comments

Comments
 (0)