@@ -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,9 @@ 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
+ return addMiddlewareHeaders ( context . rewrite ( target ) , edgeResponse )
203
209
}
204
210
205
211
if ( redirect ) {
@@ -208,27 +214,32 @@ export const buildResponse = async ({
208
214
logger . withFields ( { redirect_url : redirect } ) . debug ( 'Redirect url is same as original url' )
209
215
return
210
216
}
211
- res . headers . set ( 'location' , redirect )
217
+ edgeResponse . headers . set ( 'location' , redirect )
212
218
}
213
219
214
220
// Data requests shouldn't automatically redirect in the browser (they might be HTML pages): they're handled by the router
215
221
if ( redirect && isDataReq ) {
216
- res . headers . delete ( 'location' )
217
- res . headers . set ( 'x-nextjs-redirect' , relativizeURL ( redirect , request . url ) )
222
+ edgeResponse . headers . delete ( 'location' )
223
+ edgeResponse . headers . set ( 'x-nextjs-redirect' , relativizeURL ( redirect , request . url ) )
218
224
}
219
225
220
- nextRedirect = res . headers . get ( 'x-nextjs-redirect' )
226
+ nextRedirect = edgeResponse . headers . get ( 'x-nextjs-redirect' )
221
227
222
228
if ( nextRedirect && isDataReq ) {
223
- res . headers . set ( 'x-nextjs-redirect' , normalizeDataUrl ( nextRedirect ) )
229
+ edgeResponse . headers . set ( 'x-nextjs-redirect' , normalizeDataUrl ( nextRedirect ) )
224
230
}
225
231
226
- if ( res . headers . get ( 'x-middleware-next' ) === '1' ) {
227
- res . headers . delete ( 'x-middleware-next' )
228
- return addMiddlewareHeaders ( context . next ( ) , res )
232
+ if ( edgeResponse . headers . get ( 'x-middleware-next' ) === '1' ) {
233
+ edgeResponse . headers . delete ( 'x-middleware-next' )
234
+
235
+ // coookies set in middleware need to be available during the lambda request
236
+ const newRequest = new Request ( request )
237
+ newRequest . headers . set ( 'Cookie' , mergeMiddlewareCookies ( edgeResponse , newRequest ) )
238
+
239
+ return addMiddlewareHeaders ( context . next ( newRequest ) , edgeResponse )
229
240
}
230
241
231
- return res
242
+ return edgeResponse
232
243
}
233
244
234
245
/**
0 commit comments