1
1
import { handleMiddleware } from "@opennextjs/aws/core/routing/middleware.js" ;
2
- import { convertFromQueryString } from "@opennextjs/aws/core/routing/util.js" ;
2
+ import {
3
+ convertFromQueryString ,
4
+ isExternal ,
5
+ } from "@opennextjs/aws/core/routing/util.js" ;
3
6
import type { InternalEvent } from "@opennextjs/aws/types/open-next.js" ;
4
7
import { toReadableStream } from "@opennextjs/aws/utils/stream.js" ;
5
8
import { vi } from "vitest" ;
@@ -48,15 +51,25 @@ type PartialEvent = Partial<
48
51
> & { body ?: string } ;
49
52
50
53
function createEvent ( event : PartialEvent ) : InternalEvent {
51
- const [ rawPath , qs ] = ( event . url ?? "/" ) . split ( "?" , 2 ) ;
54
+ let rawPath : string ;
55
+ let qs : string ;
56
+ if ( isExternal ( event . url ) ) {
57
+ const url = new URL ( event . url ! ) ;
58
+ rawPath = url . pathname ;
59
+ qs = url . search ;
60
+ } else {
61
+ const parts = ( event . url ?? "/" ) . split ( "?" , 2 ) ;
62
+ rawPath = parts [ 0 ] ;
63
+ qs = parts [ 1 ] ?? "" ;
64
+ }
52
65
return {
53
66
type : "core" ,
54
67
method : event . method ?? "GET" ,
55
68
rawPath,
56
69
url : event . url ?? "/" ,
57
70
body : Buffer . from ( event . body ?? "" ) ,
58
71
headers : event . headers ?? { } ,
59
- query : convertFromQueryString ( qs ?? "" ) ,
72
+ query : convertFromQueryString ( qs ) ,
60
73
cookies : event . cookies ?? { } ,
61
74
remoteAddress : event . remoteAddress ?? "::1" ,
62
75
} ;
@@ -70,19 +83,19 @@ beforeEach(() => {
70
83
* Ideally these tests would be broken up and tests smaller parts of the middleware rather than the entire function.
71
84
*/
72
85
describe ( "handleMiddleware" , ( ) => {
73
- it ( "should bypass middlware for internal requests" , async ( ) => {
86
+ it ( "should bypass middleware for internal requests" , async ( ) => {
74
87
const event = createEvent ( {
75
88
headers : {
76
89
"x-isr" : "1" ,
77
90
} ,
78
91
} ) ;
79
92
const result = await handleMiddleware ( event , middlewareLoader ) ;
80
93
81
- expect ( middlewareLoader ) . not . toBeCalled ( ) ;
94
+ expect ( middlewareLoader ) . not . toHaveBeenCalled ( ) ;
82
95
expect ( result ) . toEqual ( event ) ;
83
96
} ) ;
84
97
85
- it ( "should invoke middlware with redirect" , async ( ) => {
98
+ it ( "should invoke middleware with redirect" , async ( ) => {
86
99
const event = createEvent ( { } ) ;
87
100
middleware . mockResolvedValue ( {
88
101
status : 302 ,
@@ -92,12 +105,12 @@ describe("handleMiddleware", () => {
92
105
} ) ;
93
106
const result = await handleMiddleware ( event , middlewareLoader ) ;
94
107
95
- expect ( middlewareLoader ) . toBeCalled ( ) ;
108
+ expect ( middlewareLoader ) . toHaveBeenCalled ( ) ;
96
109
expect ( result . statusCode ) . toEqual ( 302 ) ;
97
110
expect ( result . headers . location ) . toEqual ( "/redirect" ) ;
98
111
} ) ;
99
112
100
- it ( "should invoke middlware with external redirect" , async ( ) => {
113
+ it ( "should invoke middleware with external redirect" , async ( ) => {
101
114
const event = createEvent ( { } ) ;
102
115
middleware . mockResolvedValue ( {
103
116
status : 302 ,
@@ -107,12 +120,12 @@ describe("handleMiddleware", () => {
107
120
} ) ;
108
121
const result = await handleMiddleware ( event , middlewareLoader ) ;
109
122
110
- expect ( middlewareLoader ) . toBeCalled ( ) ;
123
+ expect ( middlewareLoader ) . toHaveBeenCalled ( ) ;
111
124
expect ( result . statusCode ) . toEqual ( 302 ) ;
112
125
expect ( result . headers . location ) . toEqual ( "http://external/redirect" ) ;
113
126
} ) ;
114
127
115
- it ( "should invoke middlware with rewrite" , async ( ) => {
128
+ it ( "should invoke middleware with rewrite" , async ( ) => {
116
129
const event = createEvent ( {
117
130
headers : {
118
131
host : "localhost" ,
@@ -125,7 +138,7 @@ describe("handleMiddleware", () => {
125
138
} ) ;
126
139
const result = await handleMiddleware ( event , middlewareLoader ) ;
127
140
128
- expect ( middlewareLoader ) . toBeCalled ( ) ;
141
+ expect ( middlewareLoader ) . toHaveBeenCalled ( ) ;
129
142
expect ( result ) . toEqual ( {
130
143
...event ,
131
144
rawPath : "/rewrite" ,
@@ -137,7 +150,7 @@ describe("handleMiddleware", () => {
137
150
} ) ;
138
151
} ) ;
139
152
140
- it ( "should invoke middlware with rewrite with __nextDataReq" , async ( ) => {
153
+ it ( "should invoke middleware with rewrite with __nextDataReq" , async ( ) => {
141
154
const event = createEvent ( {
142
155
url : "/rewrite?__nextDataReq=1&key=value" ,
143
156
headers : {
@@ -151,7 +164,7 @@ describe("handleMiddleware", () => {
151
164
} ) ;
152
165
const result = await handleMiddleware ( event , middlewareLoader ) ;
153
166
154
- expect ( middlewareLoader ) . toBeCalled ( ) ;
167
+ expect ( middlewareLoader ) . toHaveBeenCalled ( ) ;
155
168
expect ( result ) . toEqual ( {
156
169
...event ,
157
170
rawPath : "/rewrite" ,
@@ -167,7 +180,7 @@ describe("handleMiddleware", () => {
167
180
} ) ;
168
181
} ) ;
169
182
170
- it ( "should invoke middlware with external rewrite" , async ( ) => {
183
+ it ( "should invoke middleware with external rewrite" , async ( ) => {
171
184
const event = createEvent ( {
172
185
headers : {
173
186
host : "localhost" ,
@@ -180,7 +193,7 @@ describe("handleMiddleware", () => {
180
193
} ) ;
181
194
const result = await handleMiddleware ( event , middlewareLoader ) ;
182
195
183
- expect ( middlewareLoader ) . toBeCalled ( ) ;
196
+ expect ( middlewareLoader ) . toHaveBeenCalled ( ) ;
184
197
expect ( result ) . toEqual ( {
185
198
...event ,
186
199
rawPath : "http://external/rewrite" ,
@@ -201,7 +214,7 @@ describe("handleMiddleware", () => {
201
214
} ) ;
202
215
const result = await handleMiddleware ( event , middlewareLoader ) ;
203
216
204
- expect ( middlewareLoader ) . toBeCalled ( ) ;
217
+ expect ( middlewareLoader ) . toHaveBeenCalled ( ) ;
205
218
expect ( result ) . toEqual ( {
206
219
...event ,
207
220
headers : {
@@ -223,7 +236,7 @@ describe("handleMiddleware", () => {
223
236
} ) ;
224
237
const result = await handleMiddleware ( event , middlewareLoader ) ;
225
238
226
- expect ( middlewareLoader ) . toBeCalled ( ) ;
239
+ expect ( middlewareLoader ) . toHaveBeenCalled ( ) ;
227
240
expect ( result ) . toEqual ( {
228
241
type : "core" ,
229
242
statusCode : 200 ,
@@ -246,7 +259,7 @@ describe("handleMiddleware", () => {
246
259
} ) ;
247
260
const result = await handleMiddleware ( event , middlewareLoader ) ;
248
261
249
- expect ( middlewareLoader ) . toBeCalled ( ) ;
262
+ expect ( middlewareLoader ) . toHaveBeenCalled ( ) ;
250
263
expect ( result ) . toEqual ( {
251
264
type : "core" ,
252
265
statusCode : 200 ,
@@ -257,4 +270,49 @@ describe("handleMiddleware", () => {
257
270
isBase64Encoded : false ,
258
271
} ) ;
259
272
} ) ;
273
+
274
+ it ( "should use the http event protocol when specified" , async ( ) => {
275
+ const event = createEvent ( {
276
+ url : "http://test.me/path" ,
277
+ headers : {
278
+ host : "test.me" ,
279
+ } ,
280
+ } ) ;
281
+ await handleMiddleware ( event , middlewareLoader ) ;
282
+ expect ( middleware ) . toHaveBeenCalledWith (
283
+ expect . objectContaining ( {
284
+ url : "http://test.me/path" ,
285
+ } ) ,
286
+ ) ;
287
+ } ) ;
288
+
289
+ it ( "should use the https event protocol when specified" , async ( ) => {
290
+ const event = createEvent ( {
291
+ url : "https://test.me/path" ,
292
+ headers : {
293
+ host : "test.me/path" ,
294
+ } ,
295
+ } ) ;
296
+ await handleMiddleware ( event , middlewareLoader ) ;
297
+ expect ( middleware ) . toHaveBeenCalledWith (
298
+ expect . objectContaining ( {
299
+ url : "https://test.me/path" ,
300
+ } ) ,
301
+ ) ;
302
+ } ) ;
303
+
304
+ it ( "should default to https protocol" , async ( ) => {
305
+ const event = createEvent ( {
306
+ url : "/path" ,
307
+ headers : {
308
+ host : "test.me" ,
309
+ } ,
310
+ } ) ;
311
+ await handleMiddleware ( event , middlewareLoader ) ;
312
+ expect ( middleware ) . toHaveBeenCalledWith (
313
+ expect . objectContaining ( {
314
+ url : "https://test.me/path" ,
315
+ } ) ,
316
+ ) ;
317
+ } ) ;
260
318
} ) ;
0 commit comments