11import { 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" ;
36import type { InternalEvent } from "@opennextjs/aws/types/open-next.js" ;
47import { toReadableStream } from "@opennextjs/aws/utils/stream.js" ;
58import { vi } from "vitest" ;
@@ -48,15 +51,25 @@ type PartialEvent = Partial<
4851> & { body ?: string } ;
4952
5053function 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+ }
5265 return {
5366 type : "core" ,
5467 method : event . method ?? "GET" ,
5568 rawPath,
5669 url : event . url ?? "/" ,
5770 body : Buffer . from ( event . body ?? "" ) ,
5871 headers : event . headers ?? { } ,
59- query : convertFromQueryString ( qs ?? "" ) ,
72+ query : convertFromQueryString ( qs ) ,
6073 cookies : event . cookies ?? { } ,
6174 remoteAddress : event . remoteAddress ?? "::1" ,
6275 } ;
@@ -70,19 +83,19 @@ beforeEach(() => {
7083 * Ideally these tests would be broken up and tests smaller parts of the middleware rather than the entire function.
7184 */
7285describe ( "handleMiddleware" , ( ) => {
73- it ( "should bypass middlware for internal requests" , async ( ) => {
86+ it ( "should bypass middleware for internal requests" , async ( ) => {
7487 const event = createEvent ( {
7588 headers : {
7689 "x-isr" : "1" ,
7790 } ,
7891 } ) ;
7992 const result = await handleMiddleware ( event , middlewareLoader ) ;
8093
81- expect ( middlewareLoader ) . not . toBeCalled ( ) ;
94+ expect ( middlewareLoader ) . not . toHaveBeenCalled ( ) ;
8295 expect ( result ) . toEqual ( event ) ;
8396 } ) ;
8497
85- it ( "should invoke middlware with redirect" , async ( ) => {
98+ it ( "should invoke middleware with redirect" , async ( ) => {
8699 const event = createEvent ( { } ) ;
87100 middleware . mockResolvedValue ( {
88101 status : 302 ,
@@ -92,12 +105,12 @@ describe("handleMiddleware", () => {
92105 } ) ;
93106 const result = await handleMiddleware ( event , middlewareLoader ) ;
94107
95- expect ( middlewareLoader ) . toBeCalled ( ) ;
108+ expect ( middlewareLoader ) . toHaveBeenCalled ( ) ;
96109 expect ( result . statusCode ) . toEqual ( 302 ) ;
97110 expect ( result . headers . location ) . toEqual ( "/redirect" ) ;
98111 } ) ;
99112
100- it ( "should invoke middlware with external redirect" , async ( ) => {
113+ it ( "should invoke middleware with external redirect" , async ( ) => {
101114 const event = createEvent ( { } ) ;
102115 middleware . mockResolvedValue ( {
103116 status : 302 ,
@@ -107,12 +120,12 @@ describe("handleMiddleware", () => {
107120 } ) ;
108121 const result = await handleMiddleware ( event , middlewareLoader ) ;
109122
110- expect ( middlewareLoader ) . toBeCalled ( ) ;
123+ expect ( middlewareLoader ) . toHaveBeenCalled ( ) ;
111124 expect ( result . statusCode ) . toEqual ( 302 ) ;
112125 expect ( result . headers . location ) . toEqual ( "http://external/redirect" ) ;
113126 } ) ;
114127
115- it ( "should invoke middlware with rewrite" , async ( ) => {
128+ it ( "should invoke middleware with rewrite" , async ( ) => {
116129 const event = createEvent ( {
117130 headers : {
118131 host : "localhost" ,
@@ -125,7 +138,7 @@ describe("handleMiddleware", () => {
125138 } ) ;
126139 const result = await handleMiddleware ( event , middlewareLoader ) ;
127140
128- expect ( middlewareLoader ) . toBeCalled ( ) ;
141+ expect ( middlewareLoader ) . toHaveBeenCalled ( ) ;
129142 expect ( result ) . toEqual ( {
130143 ...event ,
131144 rawPath : "/rewrite" ,
@@ -137,7 +150,7 @@ describe("handleMiddleware", () => {
137150 } ) ;
138151 } ) ;
139152
140- it ( "should invoke middlware with rewrite with __nextDataReq" , async ( ) => {
153+ it ( "should invoke middleware with rewrite with __nextDataReq" , async ( ) => {
141154 const event = createEvent ( {
142155 url : "/rewrite?__nextDataReq=1&key=value" ,
143156 headers : {
@@ -151,7 +164,7 @@ describe("handleMiddleware", () => {
151164 } ) ;
152165 const result = await handleMiddleware ( event , middlewareLoader ) ;
153166
154- expect ( middlewareLoader ) . toBeCalled ( ) ;
167+ expect ( middlewareLoader ) . toHaveBeenCalled ( ) ;
155168 expect ( result ) . toEqual ( {
156169 ...event ,
157170 rawPath : "/rewrite" ,
@@ -167,7 +180,7 @@ describe("handleMiddleware", () => {
167180 } ) ;
168181 } ) ;
169182
170- it ( "should invoke middlware with external rewrite" , async ( ) => {
183+ it ( "should invoke middleware with external rewrite" , async ( ) => {
171184 const event = createEvent ( {
172185 headers : {
173186 host : "localhost" ,
@@ -180,7 +193,7 @@ describe("handleMiddleware", () => {
180193 } ) ;
181194 const result = await handleMiddleware ( event , middlewareLoader ) ;
182195
183- expect ( middlewareLoader ) . toBeCalled ( ) ;
196+ expect ( middlewareLoader ) . toHaveBeenCalled ( ) ;
184197 expect ( result ) . toEqual ( {
185198 ...event ,
186199 rawPath : "http://external/rewrite" ,
@@ -201,7 +214,7 @@ describe("handleMiddleware", () => {
201214 } ) ;
202215 const result = await handleMiddleware ( event , middlewareLoader ) ;
203216
204- expect ( middlewareLoader ) . toBeCalled ( ) ;
217+ expect ( middlewareLoader ) . toHaveBeenCalled ( ) ;
205218 expect ( result ) . toEqual ( {
206219 ...event ,
207220 headers : {
@@ -223,7 +236,7 @@ describe("handleMiddleware", () => {
223236 } ) ;
224237 const result = await handleMiddleware ( event , middlewareLoader ) ;
225238
226- expect ( middlewareLoader ) . toBeCalled ( ) ;
239+ expect ( middlewareLoader ) . toHaveBeenCalled ( ) ;
227240 expect ( result ) . toEqual ( {
228241 type : "core" ,
229242 statusCode : 200 ,
@@ -246,7 +259,7 @@ describe("handleMiddleware", () => {
246259 } ) ;
247260 const result = await handleMiddleware ( event , middlewareLoader ) ;
248261
249- expect ( middlewareLoader ) . toBeCalled ( ) ;
262+ expect ( middlewareLoader ) . toHaveBeenCalled ( ) ;
250263 expect ( result ) . toEqual ( {
251264 type : "core" ,
252265 statusCode : 200 ,
@@ -257,4 +270,49 @@ describe("handleMiddleware", () => {
257270 isBase64Encoded : false ,
258271 } ) ;
259272 } ) ;
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+ } ) ;
260318} ) ;
0 commit comments