@@ -163,25 +163,13 @@ export const buildResponse = async ({
163
163
164
164
if ( rewriteUrl . origin !== baseUrl . origin ) {
165
165
logger . withFields ( { rewrite_url : rewrite } ) . debug ( 'Rewriting to external url' )
166
- let proxyRequest : Request
166
+ const proxyRequest = await cloneRequest ( rewriteUrl , request )
167
167
168
168
// 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
+ }
185
173
}
186
174
187
175
return addMiddlewareHeaders ( fetch ( proxyRequest , { redirect : 'manual' } ) , edgeResponse )
@@ -207,7 +195,7 @@ export const buildResponse = async ({
207
195
request . headers . set ( 'x-middleware-rewrite' , target )
208
196
209
197
// 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 )
211
199
const newRequestCookies = mergeMiddlewareCookies ( edgeResponse , newRequest )
212
200
if ( newRequestCookies ) {
213
201
newRequest . headers . set ( 'Cookie' , newRequestCookies )
@@ -241,7 +229,7 @@ export const buildResponse = async ({
241
229
edgeResponse . headers . delete ( 'x-middleware-next' )
242
230
243
231
// 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 )
245
233
const newRequestCookies = mergeMiddlewareCookies ( edgeResponse , newRequest )
246
234
if ( newRequestCookies ) {
247
235
newRequest . headers . set ( 'Cookie' , newRequestCookies )
@@ -284,3 +272,13 @@ function normalizeLocalizedTarget({
284
272
}
285
273
return targetUrl . toString ( )
286
274
}
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