@@ -6,7 +6,12 @@ import {
6
6
7
7
import { updateModifiedHeaders } from './headers.ts'
8
8
import 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'
10
15
import { RequestData } from './next-request.ts'
11
16
import {
12
17
addBasePath ,
@@ -116,12 +121,13 @@ export const buildResponse = async ({
116
121
}
117
122
return rewriter . transform ( response . originResponse )
118
123
}
119
- const res = new Response ( result . response . body , result . response )
124
+
125
+ const edgeResponse = new Response ( result . response . body , result . response )
120
126
request . headers . set ( 'x-nf-next-middleware' , 'skip' )
121
127
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' )
125
131
126
132
// Data requests (i.e. requests for /_next/data ) need special handling
127
133
const isDataReq = request . headers . has ( 'x-nextjs-data' )
@@ -152,7 +158,7 @@ export const buildResponse = async ({
152
158
// Data requests might be rewritten to an external URL
153
159
// This header tells the client router the redirect target, and if it's external then it will do a full navigation
154
160
155
- res . headers . set ( 'x-nextjs-rewrite' , relativeUrl )
161
+ edgeResponse . headers . set ( 'x-nextjs-rewrite' , relativeUrl )
156
162
}
157
163
158
164
if ( rewriteUrl . origin !== baseUrl . origin ) {
@@ -178,7 +184,7 @@ export const buildResponse = async ({
178
184
} )
179
185
}
180
186
181
- return addMiddlewareHeaders ( fetch ( proxyRequest , { redirect : 'manual' } ) , res )
187
+ return addMiddlewareHeaders ( fetch ( proxyRequest , { redirect : 'manual' } ) , edgeResponse )
182
188
}
183
189
184
190
if ( isDataReq ) {
@@ -197,9 +203,17 @@ export const buildResponse = async ({
197
203
logger . withFields ( { rewrite_url : rewrite } ) . debug ( 'Rewrite url is same as original url' )
198
204
return
199
205
}
200
- res . headers . set ( 'x-middleware-rewrite' , relativeUrl )
206
+ edgeResponse . headers . set ( 'x-middleware-rewrite' , relativeUrl )
201
207
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 )
203
217
}
204
218
205
219
if ( redirect ) {
@@ -208,27 +222,35 @@ export const buildResponse = async ({
208
222
logger . withFields ( { redirect_url : redirect } ) . debug ( 'Redirect url is same as original url' )
209
223
return
210
224
}
211
- res . headers . set ( 'location' , redirect )
225
+ edgeResponse . headers . set ( 'location' , redirect )
212
226
}
213
227
214
228
// Data requests shouldn't automatically redirect in the browser (they might be HTML pages): they're handled by the router
215
229
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 ) )
218
232
}
219
233
220
- nextRedirect = res . headers . get ( 'x-nextjs-redirect' )
234
+ nextRedirect = edgeResponse . headers . get ( 'x-nextjs-redirect' )
221
235
222
236
if ( nextRedirect && isDataReq ) {
223
- res . headers . set ( 'x-nextjs-redirect' , normalizeDataUrl ( nextRedirect ) )
237
+ edgeResponse . headers . set ( 'x-nextjs-redirect' , normalizeDataUrl ( nextRedirect ) )
224
238
}
225
239
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 )
229
251
}
230
252
231
- return res
253
+ return edgeResponse
232
254
}
233
255
234
256
/**
0 commit comments