@@ -12,7 +12,7 @@ import type {
1212 RoutingResult ,
1313} from "types/open-next" ;
1414
15- import { debug } from "../adapters/logger" ;
15+ import { debug , error } from "../adapters/logger" ;
1616import { cacheInterceptor } from "./routing/cacheInterceptor" ;
1717import { detectLocale } from "./routing/i18n" ;
1818import {
@@ -65,169 +65,196 @@ function applyMiddlewareHeaders(
6565export default async function routingHandler (
6666 event : InternalEvent ,
6767) : Promise < InternalResult | RoutingResult > {
68- // Add Next geo headers
69- for ( const [ openNextGeoName , nextGeoName ] of Object . entries (
70- geoHeaderToNextHeader ,
71- ) ) {
72- const value = event . headers [ openNextGeoName ] ;
73- if ( value ) {
74- event . headers [ nextGeoName ] = value ;
68+ try {
69+ // Add Next geo headers
70+ for ( const [ openNextGeoName , nextGeoName ] of Object . entries (
71+ geoHeaderToNextHeader ,
72+ ) ) {
73+ const value = event . headers [ openNextGeoName ] ;
74+ if ( value ) {
75+ event . headers [ nextGeoName ] = value ;
76+ }
7577 }
76- }
7778
78- // First we remove internal headers
79- // We don't want to allow users to set these headers
80- for ( const key of Object . keys ( event . headers ) ) {
81- if (
82- key . startsWith ( INTERNAL_HEADER_PREFIX ) ||
83- key . startsWith ( MIDDLEWARE_HEADER_PREFIX )
84- ) {
85- delete event . headers [ key ] ;
79+ // First we remove internal headers
80+ // We don't want to allow users to set these headers
81+ for ( const key of Object . keys ( event . headers ) ) {
82+ if (
83+ key . startsWith ( INTERNAL_HEADER_PREFIX ) ||
84+ key . startsWith ( MIDDLEWARE_HEADER_PREFIX )
85+ ) {
86+ delete event . headers [ key ] ;
87+ }
8688 }
87- }
8889
89- const nextHeaders = getNextConfigHeaders ( event , ConfigHeaders ) ;
90+ const nextHeaders = getNextConfigHeaders ( event , ConfigHeaders ) ;
9091
91- let internalEvent = fixDataPage ( event , BuildId ) ;
92- if ( "statusCode" in internalEvent ) {
93- return internalEvent ;
94- }
92+ let internalEvent = fixDataPage ( event , BuildId ) ;
93+ if ( "statusCode" in internalEvent ) {
94+ return internalEvent ;
95+ }
9596
96- const redirect = handleRedirects ( internalEvent , RoutesManifest . redirects ) ;
97- if ( redirect ) {
98- debug ( "redirect" , redirect ) ;
99- return redirect ;
100- }
97+ const redirect = handleRedirects ( internalEvent , RoutesManifest . redirects ) ;
98+ if ( redirect ) {
99+ debug ( "redirect" , redirect ) ;
100+ return redirect ;
101+ }
101102
102- const eventOrResult = await handleMiddleware ( internalEvent ) ;
103- const isResult = "statusCode" in eventOrResult ;
104- if ( isResult ) {
105- return eventOrResult ;
106- }
107- const middlewareResponseHeaders = eventOrResult . responseHeaders ;
108- let isExternalRewrite = eventOrResult . isExternalRewrite ?? false ;
109- // internalEvent is `InternalEvent | MiddlewareEvent`
110- internalEvent = eventOrResult ;
111-
112- if ( ! isExternalRewrite ) {
113- // First rewrite to be applied
114- const beforeRewrites = handleRewrites (
115- internalEvent ,
116- RoutesManifest . rewrites . beforeFiles ,
117- ) ;
118- internalEvent = beforeRewrites . internalEvent ;
119- isExternalRewrite = beforeRewrites . isExternalRewrite ;
120- }
121- const foundStaticRoute = staticRouteMatcher ( internalEvent . rawPath ) ;
122- const isStaticRoute = ! isExternalRewrite && foundStaticRoute . length > 0 ;
103+ const eventOrResult = await handleMiddleware ( internalEvent ) ;
104+ const isResult = "statusCode" in eventOrResult ;
105+ if ( isResult ) {
106+ return eventOrResult ;
107+ }
108+ const middlewareResponseHeaders = eventOrResult . responseHeaders ;
109+ let isExternalRewrite = eventOrResult . isExternalRewrite ?? false ;
110+ // internalEvent is `InternalEvent | MiddlewareEvent`
111+ internalEvent = eventOrResult ;
123112
124- if ( ! ( isStaticRoute || isExternalRewrite ) ) {
125- // Second rewrite to be applied
126- const afterRewrites = handleRewrites (
113+ if ( ! isExternalRewrite ) {
114+ // First rewrite to be applied
115+ const beforeRewrites = handleRewrites (
116+ internalEvent ,
117+ RoutesManifest . rewrites . beforeFiles ,
118+ ) ;
119+ internalEvent = beforeRewrites . internalEvent ;
120+ isExternalRewrite = beforeRewrites . isExternalRewrite ;
121+ }
122+ const foundStaticRoute = staticRouteMatcher ( internalEvent . rawPath ) ;
123+ const isStaticRoute = ! isExternalRewrite && foundStaticRoute . length > 0 ;
124+
125+ if ( ! ( isStaticRoute || isExternalRewrite ) ) {
126+ // Second rewrite to be applied
127+ const afterRewrites = handleRewrites (
128+ internalEvent ,
129+ RoutesManifest . rewrites . afterFiles ,
130+ ) ;
131+ internalEvent = afterRewrites . internalEvent ;
132+ isExternalRewrite = afterRewrites . isExternalRewrite ;
133+ }
134+
135+ // We want to run this just before the dynamic route check
136+ const { event : fallbackEvent , isISR } = handleFallbackFalse (
127137 internalEvent ,
128- RoutesManifest . rewrites . afterFiles ,
138+ PrerenderManifest ,
129139 ) ;
130- internalEvent = afterRewrites . internalEvent ;
131- isExternalRewrite = afterRewrites . isExternalRewrite ;
132- }
140+ internalEvent = fallbackEvent ;
133141
134- // We want to run this just before the dynamic route check
135- const { event : fallbackEvent , isISR } = handleFallbackFalse (
136- internalEvent ,
137- PrerenderManifest ,
138- ) ;
139- internalEvent = fallbackEvent ;
142+ const foundDynamicRoute = dynamicRouteMatcher ( internalEvent . rawPath ) ;
143+ const isDynamicRoute = ! isExternalRewrite && foundDynamicRoute . length > 0 ;
140144
141- const foundDynamicRoute = dynamicRouteMatcher ( internalEvent . rawPath ) ;
142- const isDynamicRoute = ! isExternalRewrite && foundDynamicRoute . length > 0 ;
145+ if ( ! ( isDynamicRoute || isStaticRoute || isExternalRewrite ) ) {
146+ // Fallback rewrite to be applied
147+ const fallbackRewrites = handleRewrites (
148+ internalEvent ,
149+ RoutesManifest . rewrites . fallback ,
150+ ) ;
151+ internalEvent = fallbackRewrites . internalEvent ;
152+ isExternalRewrite = fallbackRewrites . isExternalRewrite ;
153+ }
143154
144- if ( ! ( isDynamicRoute || isStaticRoute || isExternalRewrite ) ) {
145- // Fallback rewrite to be applied
146- const fallbackRewrites = handleRewrites (
147- internalEvent ,
148- RoutesManifest . rewrites . fallback ,
149- ) ;
150- internalEvent = fallbackRewrites . internalEvent ;
151- isExternalRewrite = fallbackRewrites . isExternalRewrite ;
152- }
155+ // Api routes are not present in the routes manifest except if they're not behind /api
156+ // /api even if it's a page route doesn't get generated in the manifest
157+ // Ideally we would need to properly check api routes here
158+ const isApiRoute =
159+ internalEvent . rawPath === apiPrefix ||
160+ internalEvent . rawPath . startsWith ( `${ apiPrefix } /` ) ;
153161
154- // Api routes are not present in the routes manifest except if they're not behind /api
155- // /api even if it's a page route doesn't get generated in the manifest
156- // Ideally we would need to properly check api routes here
157- const isApiRoute =
158- internalEvent . rawPath === apiPrefix ||
159- internalEvent . rawPath . startsWith ( `${ apiPrefix } /` ) ;
160-
161- const isNextImageRoute = internalEvent . rawPath . startsWith ( "/_next/image" ) ;
162-
163- const isRouteFoundBeforeAllRewrites =
164- isStaticRoute || isDynamicRoute || isExternalRewrite ;
165-
166- // If we still haven't found a route, we show the 404 page
167- // We need to ensure that rewrites are applied before showing the 404 page
168- if (
169- ! (
170- isRouteFoundBeforeAllRewrites ||
171- isApiRoute ||
172- isNextImageRoute ||
173- // We need to check again once all rewrites have been applied
174- staticRouteMatcher ( internalEvent . rawPath ) . length > 0 ||
175- dynamicRouteMatcher ( internalEvent . rawPath ) . length > 0
176- )
177- ) {
178- internalEvent = {
179- ...internalEvent ,
180- rawPath : "/404" ,
181- url : constructNextUrl ( internalEvent . url , "/404" ) ,
182- headers : {
183- ...internalEvent . headers ,
184- "x-middleware-response-cache-control" :
185- "private, no-cache, no-store, max-age=0, must-revalidate" ,
186- } ,
187- } ;
188- }
162+ const isNextImageRoute = internalEvent . rawPath . startsWith ( "/_next/image" ) ;
189163
190- if (
191- globalThis . openNextConfig . dangerous ?. enableCacheInterception &&
192- ! ( "statusCode" in internalEvent )
193- ) {
194- debug ( "Cache interception enabled" ) ;
195- internalEvent = await cacheInterceptor ( internalEvent ) ;
196- if ( "statusCode" in internalEvent ) {
197- applyMiddlewareHeaders (
198- internalEvent . headers ,
199- {
200- ...middlewareResponseHeaders ,
201- ...nextHeaders ,
164+ const isRouteFoundBeforeAllRewrites =
165+ isStaticRoute || isDynamicRoute || isExternalRewrite ;
166+
167+ // If we still haven't found a route, we show the 404 page
168+ // We need to ensure that rewrites are applied before showing the 404 page
169+ if (
170+ ! (
171+ isRouteFoundBeforeAllRewrites ||
172+ isApiRoute ||
173+ isNextImageRoute ||
174+ // We need to check again once all rewrites have been applied
175+ staticRouteMatcher ( internalEvent . rawPath ) . length > 0 ||
176+ dynamicRouteMatcher ( internalEvent . rawPath ) . length > 0
177+ )
178+ ) {
179+ internalEvent = {
180+ ...internalEvent ,
181+ rawPath : "/404" ,
182+ url : constructNextUrl ( internalEvent . url , "/404" ) ,
183+ headers : {
184+ ...internalEvent . headers ,
185+ "x-middleware-response-cache-control" :
186+ "private, no-cache, no-store, max-age=0, must-revalidate" ,
202187 } ,
203- false ,
204- ) ;
205- return internalEvent ;
188+ } ;
206189 }
207- }
208190
209- // We apply the headers from the middleware response last
210- applyMiddlewareHeaders ( internalEvent . headers , {
211- ...middlewareResponseHeaders ,
212- ...nextHeaders ,
213- } ) ;
191+ if (
192+ globalThis . openNextConfig . dangerous ?. enableCacheInterception &&
193+ ! ( "statusCode" in internalEvent )
194+ ) {
195+ debug ( "Cache interception enabled" ) ;
196+ internalEvent = await cacheInterceptor ( internalEvent ) ;
197+ if ( "statusCode" in internalEvent ) {
198+ applyMiddlewareHeaders (
199+ internalEvent . headers ,
200+ {
201+ ...middlewareResponseHeaders ,
202+ ...nextHeaders ,
203+ } ,
204+ false ,
205+ ) ;
206+ return internalEvent ;
207+ }
208+ }
209+
210+ // We apply the headers from the middleware response last
211+ applyMiddlewareHeaders ( internalEvent . headers , {
212+ ...middlewareResponseHeaders ,
213+ ...nextHeaders ,
214+ } ) ;
215+
216+ const resolvedRoutes : ResolvedRoute [ ] = [
217+ ...foundStaticRoute ,
218+ ...foundDynamicRoute ,
219+ ] ;
220+
221+ debug ( "resolvedRoutes" , resolvedRoutes ) ;
214222
215- const resolvedRoutes : ResolvedRoute [ ] = [
216- ...foundStaticRoute ,
217- ...foundDynamicRoute ,
218- ] ;
219-
220- debug ( "resolvedRoutes" , resolvedRoutes ) ;
221-
222- return {
223- internalEvent,
224- isExternalRewrite,
225- origin : false ,
226- isISR,
227- resolvedRoutes,
228- initialURL : event . url ,
229- locale : NextConfig . i18n
230- ? detectLocale ( internalEvent , NextConfig . i18n )
231- : undefined ,
232- } ;
223+ return {
224+ internalEvent,
225+ isExternalRewrite,
226+ origin : false ,
227+ isISR,
228+ resolvedRoutes,
229+ initialURL : event . url ,
230+ locale : NextConfig . i18n
231+ ? detectLocale ( internalEvent , NextConfig . i18n )
232+ : undefined ,
233+ } ;
234+ } catch ( e ) {
235+ error ( "Error in routingHandler" , e ) ;
236+ // In case of an error, we want to return the 500 page from Next.js
237+ return {
238+ internalEvent : {
239+ type : "core" ,
240+ method : "GET" ,
241+ rawPath : "/500" ,
242+ url : constructNextUrl ( event . url , "/500" ) ,
243+ headers : {
244+ ...event . headers ,
245+ } ,
246+ query : event . query ,
247+ cookies : event . cookies ,
248+ remoteAddress : event . remoteAddress ,
249+ } ,
250+ isExternalRewrite : false ,
251+ origin : false ,
252+ isISR : false ,
253+ resolvedRoutes : [ ] ,
254+ initialURL : event . url ,
255+ locale : NextConfig . i18n
256+ ? detectLocale ( event , NextConfig . i18n )
257+ : undefined ,
258+ } ;
259+ }
233260}
0 commit comments