File tree 5 files changed +45
-2
lines changed
cypress/integration/middleware
runtime/src/templates/edge-shared
5 files changed +45
-2
lines changed Original file line number Diff line number Diff line change @@ -37,6 +37,14 @@ describe('Standard middleware', () => {
37
37
cy . getCookie ( 'netlifyCookie' ) . should ( 'have.property' , 'value' , 'true' )
38
38
} )
39
39
} )
40
+
41
+ // https://github.com/netlify/pillar-support/issues/350
42
+ it ( 'MiddlewareResponse adds cookies' , ( ) => {
43
+ cy . request ( '/cookies/middleware' ) . then ( ( response ) => {
44
+ cy . getCookie ( 'middlewareCookie' ) . should ( 'have.property' , 'value' , 'true' )
45
+ expect ( response . headers ) . to . have . property ( 'x-foo' , 'bar' )
46
+ } )
47
+ } )
40
48
} )
41
49
42
50
describe ( 'Middleware matchers' , ( ) => {
Original file line number Diff line number Diff line change @@ -53,6 +53,13 @@ export async function middleware(req: NextRequest) {
53
53
return request . rewrite ( '/api/hello' )
54
54
}
55
55
56
+ if ( pathname . startsWith ( '/cookies/middleware' ) ) {
57
+ const response = await new MiddlewareRequest ( req ) . next ( )
58
+ response . cookies . set ( 'middlewareCookie' , 'true' )
59
+ response . headers . set ( 'x-foo' , 'bar' )
60
+ return response
61
+ }
62
+
56
63
if ( pathname . startsWith ( '/cookies' ) ) {
57
64
response = NextResponse . next ( )
58
65
response . cookies . set ( 'netlifyCookie' , 'true' )
@@ -129,8 +136,8 @@ export const config = {
129
136
matcher : [
130
137
'/api/:all*' ,
131
138
'/headers' ,
139
+ '/cookies/:path*' ,
132
140
{ source : '/static' } ,
133
- { source : '/cookies' } ,
134
141
{ source : '/matcher-cookie' } ,
135
142
{ source : '/shows/((?!99|88).*)' } ,
136
143
{
Original file line number Diff line number Diff line change
1
+ const Cookies = ( ) => {
2
+ return (
3
+ < div >
4
+ < p > The cookie "middlewareCookie" should be set to true</ p >
5
+ </ div >
6
+ )
7
+ }
8
+
9
+ export default Cookies
Original file line number Diff line number Diff line change @@ -11,7 +11,15 @@ export class MiddlewareResponse extends NextResponse {
11
11
private readonly dataTransforms : NextDataTransform [ ]
12
12
private readonly elementHandlers : Array < [ selector : string , handlers : ElementHandlers ] >
13
13
constructor ( public originResponse : Response ) {
14
- super ( )
14
+ // we need to propagate the set-cookie header, so response.cookies.get works correctly
15
+ const initHeaders = new Headers ( )
16
+ if ( originResponse . headers . has ( 'set-cookie' ) ) {
17
+ initHeaders . set ( 'set-cookie' , originResponse . headers . get ( 'set-cookie' ) )
18
+ }
19
+
20
+ super ( undefined , {
21
+ headers : initHeaders ,
22
+ } )
15
23
16
24
// These are private in Node when compiling, but we access them in Deno at runtime
17
25
Object . defineProperty ( this , 'dataTransforms' , {
Original file line number Diff line number Diff line change @@ -57,10 +57,15 @@ export const addMiddlewareHeaders = async (
57
57
return response
58
58
}
59
59
60
+ interface ResponseCookies {
61
+ readonly _headers : Headers
62
+ }
63
+
60
64
interface MiddlewareResponse extends Response {
61
65
originResponse : Response
62
66
dataTransforms : NextDataTransform [ ]
63
67
elementHandlers : Array < [ selector : string , handlers : ElementHandlers ] >
68
+ get cookies ( ) : ResponseCookies
64
69
}
65
70
66
71
interface MiddlewareRequest {
@@ -184,6 +189,12 @@ export const buildResponse = async ({
184
189
if ( request . method === 'HEAD' || request . method === 'OPTIONS' ) {
185
190
return response . originResponse
186
191
}
192
+
193
+ // NextResponse doesn't set cookies onto the originResponse, so we need to copy them over
194
+ if ( response . cookies . _headers . has ( 'set-cookie' ) ) {
195
+ response . originResponse . headers . set ( 'set-cookie' , response . cookies . _headers . get ( 'set-cookie' ) ! )
196
+ }
197
+
187
198
// If it's JSON we don't need to use the rewriter, we can just parse it
188
199
if ( response . originResponse . headers . get ( 'content-type' ) ?. includes ( 'application/json' ) ) {
189
200
const props = await response . originResponse . json ( )
You can’t perform that action at this time.
0 commit comments