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