From 0f02b90cf12d75f40653acffde75563173bb1687 Mon Sep 17 00:00:00 2001 From: Mateusz Bocian Date: Thu, 1 May 2025 00:09:14 -0400 Subject: [PATCH 1/2] fix: address edge can read request body failures --- edge-runtime/lib/response.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/edge-runtime/lib/response.ts b/edge-runtime/lib/response.ts index 60cf9fd4b9..10e7070ae2 100644 --- a/edge-runtime/lib/response.ts +++ b/edge-runtime/lib/response.ts @@ -241,7 +241,11 @@ export const buildResponse = async ({ edgeResponse.headers.delete('x-middleware-next') // coookies set in middleware need to be available during the lambda request - const newRequest = new Request(request) + const newRequest = new Request(request.url, { + headers: request.headers, + method: request.method, + body: request.body && !request.bodyUsed ? await request.arrayBuffer() : undefined, + }) const newRequestCookies = mergeMiddlewareCookies(edgeResponse, newRequest) if (newRequestCookies) { newRequest.headers.set('Cookie', newRequestCookies) From 7ca2f220ed066a4a823237b34e8de4b73443a3d1 Mon Sep 17 00:00:00 2001 From: Mateusz Bocian Date: Tue, 6 May 2025 09:54:01 -0400 Subject: [PATCH 2/2] fix: apply multiple body reads patch to rewrite case --- edge-runtime/lib/response.ts | 40 +++++++++++++++--------------------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/edge-runtime/lib/response.ts b/edge-runtime/lib/response.ts index 10e7070ae2..31bb7ead7b 100644 --- a/edge-runtime/lib/response.ts +++ b/edge-runtime/lib/response.ts @@ -163,25 +163,13 @@ export const buildResponse = async ({ if (rewriteUrl.origin !== baseUrl.origin) { logger.withFields({ rewrite_url: rewrite }).debug('Rewriting to external url') - let proxyRequest: Request + const proxyRequest = await cloneRequest(rewriteUrl, request) // Remove Netlify internal headers - const headers = new Headers( - [...request.headers.entries()].filter(([key]) => !key.startsWith('x-nf-')), - ) - if (request.body && !request.bodyUsed) { - // This is not ideal, but streaming to an external URL doesn't work - const body = await request.arrayBuffer() - proxyRequest = new Request(rewriteUrl, { - headers, - method: request.method, - body, - }) - } else { - proxyRequest = new Request(rewriteUrl, { - headers, - method: request.method, - }) + for (const key of request.headers.keys()) { + if (key.startsWith('x-nf-')) { + proxyRequest.headers.delete(key) + } } return addMiddlewareHeaders(fetch(proxyRequest, { redirect: 'manual' }), edgeResponse) @@ -207,7 +195,7 @@ export const buildResponse = async ({ request.headers.set('x-middleware-rewrite', target) // coookies set in middleware need to be available during the lambda request - const newRequest = new Request(target, request) + const newRequest = await cloneRequest(target, request) const newRequestCookies = mergeMiddlewareCookies(edgeResponse, newRequest) if (newRequestCookies) { newRequest.headers.set('Cookie', newRequestCookies) @@ -241,11 +229,7 @@ export const buildResponse = async ({ edgeResponse.headers.delete('x-middleware-next') // coookies set in middleware need to be available during the lambda request - const newRequest = new Request(request.url, { - headers: request.headers, - method: request.method, - body: request.body && !request.bodyUsed ? await request.arrayBuffer() : undefined, - }) + const newRequest = await cloneRequest(request.url, request) const newRequestCookies = mergeMiddlewareCookies(edgeResponse, newRequest) if (newRequestCookies) { newRequest.headers.set('Cookie', newRequestCookies) @@ -288,3 +272,13 @@ function normalizeLocalizedTarget({ } return targetUrl.toString() } + +async function cloneRequest(url, request: Request) { + // This is not ideal, but streaming to an external URL doesn't work + const body = request.body && !request.bodyUsed ? await request.arrayBuffer() : undefined + return new Request(url, { + headers: request.headers, + method: request.method, + body, + }) +}