@@ -6,7 +6,12 @@ import {
66
77import { updateModifiedHeaders } from './headers.ts'
88import type { StructuredLogger } from './logging.ts'
9- import { addMiddlewareHeaders , isMiddlewareRequest , isMiddlewareResponse } from './middleware.ts'
9+ import {
10+ addMiddlewareHeaders ,
11+ isMiddlewareRequest ,
12+ isMiddlewareResponse ,
13+ mergeMiddlewareCookies ,
14+ } from './middleware.ts'
1015import { RequestData } from './next-request.ts'
1116import {
1217 addBasePath ,
@@ -116,12 +121,13 @@ export const buildResponse = async ({
116121 }
117122 return rewriter . transform ( response . originResponse )
118123 }
119- const res = new Response ( result . response . body , result . response )
124+
125+ const edgeResponse = new Response ( result . response . body , result . response )
120126 request . headers . set ( 'x-nf-next-middleware' , 'skip' )
121127
122- let rewrite = res . headers . get ( 'x-middleware-rewrite' )
123- let redirect = res . headers . get ( 'location' )
124- let nextRedirect = res . headers . get ( 'x-nextjs-redirect' )
128+ let rewrite = edgeResponse . headers . get ( 'x-middleware-rewrite' )
129+ let redirect = edgeResponse . headers . get ( 'location' )
130+ let nextRedirect = edgeResponse . headers . get ( 'x-nextjs-redirect' )
125131
126132 // Data requests (i.e. requests for /_next/data ) need special handling
127133 const isDataReq = request . headers . has ( 'x-nextjs-data' )
@@ -152,7 +158,7 @@ export const buildResponse = async ({
152158 // Data requests might be rewritten to an external URL
153159 // This header tells the client router the redirect target, and if it's external then it will do a full navigation
154160
155- res . headers . set ( 'x-nextjs-rewrite' , relativeUrl )
161+ edgeResponse . headers . set ( 'x-nextjs-rewrite' , relativeUrl )
156162 }
157163
158164 if ( rewriteUrl . origin !== baseUrl . origin ) {
@@ -178,7 +184,7 @@ export const buildResponse = async ({
178184 } )
179185 }
180186
181- return addMiddlewareHeaders ( fetch ( proxyRequest , { redirect : 'manual' } ) , res )
187+ return addMiddlewareHeaders ( fetch ( proxyRequest , { redirect : 'manual' } ) , edgeResponse )
182188 }
183189
184190 if ( isDataReq ) {
@@ -197,9 +203,17 @@ export const buildResponse = async ({
197203 logger . withFields ( { rewrite_url : rewrite } ) . debug ( 'Rewrite url is same as original url' )
198204 return
199205 }
200- res . headers . set ( 'x-middleware-rewrite' , relativeUrl )
206+ edgeResponse . headers . set ( 'x-middleware-rewrite' , relativeUrl )
201207 request . headers . set ( 'x-middleware-rewrite' , target )
202- return addMiddlewareHeaders ( context . rewrite ( target ) , res )
208+
209+ // coookies set in middleware need to be available during the lambda request
210+ const newRequest = new Request ( target , request )
211+ const newRequestCookies = mergeMiddlewareCookies ( edgeResponse , newRequest )
212+ if ( newRequestCookies ) {
213+ newRequest . headers . set ( 'Cookie' , newRequestCookies )
214+ }
215+
216+ return addMiddlewareHeaders ( context . next ( newRequest ) , edgeResponse )
203217 }
204218
205219 if ( redirect ) {
@@ -208,27 +222,35 @@ export const buildResponse = async ({
208222 logger . withFields ( { redirect_url : redirect } ) . debug ( 'Redirect url is same as original url' )
209223 return
210224 }
211- res . headers . set ( 'location' , redirect )
225+ edgeResponse . headers . set ( 'location' , redirect )
212226 }
213227
214228 // Data requests shouldn't automatically redirect in the browser (they might be HTML pages): they're handled by the router
215229 if ( redirect && isDataReq ) {
216- res . headers . delete ( 'location' )
217- res . headers . set ( 'x-nextjs-redirect' , relativizeURL ( redirect , request . url ) )
230+ edgeResponse . headers . delete ( 'location' )
231+ edgeResponse . headers . set ( 'x-nextjs-redirect' , relativizeURL ( redirect , request . url ) )
218232 }
219233
220- nextRedirect = res . headers . get ( 'x-nextjs-redirect' )
234+ nextRedirect = edgeResponse . headers . get ( 'x-nextjs-redirect' )
221235
222236 if ( nextRedirect && isDataReq ) {
223- res . headers . set ( 'x-nextjs-redirect' , normalizeDataUrl ( nextRedirect ) )
237+ edgeResponse . headers . set ( 'x-nextjs-redirect' , normalizeDataUrl ( nextRedirect ) )
224238 }
225239
226- if ( res . headers . get ( 'x-middleware-next' ) === '1' ) {
227- res . headers . delete ( 'x-middleware-next' )
228- return addMiddlewareHeaders ( context . next ( ) , res )
240+ if ( edgeResponse . headers . get ( 'x-middleware-next' ) === '1' ) {
241+ edgeResponse . headers . delete ( 'x-middleware-next' )
242+
243+ // coookies set in middleware need to be available during the lambda request
244+ const newRequest = new Request ( request )
245+ const newRequestCookies = mergeMiddlewareCookies ( edgeResponse , newRequest )
246+ if ( newRequestCookies ) {
247+ newRequest . headers . set ( 'Cookie' , newRequestCookies )
248+ }
249+
250+ return addMiddlewareHeaders ( context . next ( newRequest ) , edgeResponse )
229251 }
230252
231- return res
253+ return edgeResponse
232254}
233255
234256/**
0 commit comments