@@ -12,7 +12,7 @@ import type {
12
12
RoutingResult ,
13
13
} from "types/open-next" ;
14
14
15
- import { debug } from "../adapters/logger" ;
15
+ import { debug , error } from "../adapters/logger" ;
16
16
import { cacheInterceptor } from "./routing/cacheInterceptor" ;
17
17
import { detectLocale } from "./routing/i18n" ;
18
18
import {
@@ -65,169 +65,196 @@ function applyMiddlewareHeaders(
65
65
export default async function routingHandler (
66
66
event : InternalEvent ,
67
67
) : 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
+ }
75
77
}
76
- }
77
78
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
+ }
86
88
}
87
- }
88
89
89
- const nextHeaders = getNextConfigHeaders ( event , ConfigHeaders ) ;
90
+ const nextHeaders = getNextConfigHeaders ( event , ConfigHeaders ) ;
90
91
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
+ }
95
96
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
+ }
101
102
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 ;
123
112
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 (
127
137
internalEvent ,
128
- RoutesManifest . rewrites . afterFiles ,
138
+ PrerenderManifest ,
129
139
) ;
130
- internalEvent = afterRewrites . internalEvent ;
131
- isExternalRewrite = afterRewrites . isExternalRewrite ;
132
- }
140
+ internalEvent = fallbackEvent ;
133
141
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 ;
140
144
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
+ }
143
154
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 } /` ) ;
153
161
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" ) ;
189
163
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" ,
202
187
} ,
203
- false ,
204
- ) ;
205
- return internalEvent ;
188
+ } ;
206
189
}
207
- }
208
190
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 ) ;
214
222
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
+ }
233
260
}
0 commit comments