@opennextjs/aws 3.5.4 → 3.5.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -2,7 +2,7 @@ import { AsyncLocalStorage } from "node:async_hooks";
|
|
|
2
2
|
import { IncomingMessage } from "../http/index.js";
|
|
3
3
|
import { runWithOpenNextRequestContext } from "../utils/promise";
|
|
4
4
|
import { NextConfig } from "../adapters/config/index";
|
|
5
|
-
import { debug, error
|
|
5
|
+
import { debug, error } from "../adapters/logger";
|
|
6
6
|
import { patchAsyncStorage } from "./patchAsyncStorage";
|
|
7
7
|
import { constructNextUrl, convertRes, convertToQuery, createServerResponse, } from "./routing/util";
|
|
8
8
|
import routingHandler, { INTERNAL_HEADER_INITIAL_URL, INTERNAL_HEADER_RESOLVED_ROUTES, MIDDLEWARE_HEADER_PREFIX, MIDDLEWARE_HEADER_PREFIX_LEN, } from "./routingHandler";
|
|
@@ -39,12 +39,7 @@ export async function openNextHandler(internalEvent, options) {
|
|
|
39
39
|
...internalHeaders,
|
|
40
40
|
};
|
|
41
41
|
//#override withRouting
|
|
42
|
-
|
|
43
|
-
routingResult = await routingHandler(internalEvent);
|
|
44
|
-
}
|
|
45
|
-
catch (e) {
|
|
46
|
-
warn("Routing failed.", e);
|
|
47
|
-
}
|
|
42
|
+
routingResult = await routingHandler(internalEvent);
|
|
48
43
|
//#endOverride
|
|
49
44
|
const headers = "type" in routingResult
|
|
50
45
|
? routingResult.headers
|
|
@@ -117,13 +117,11 @@ export async function handleMiddleware(internalEvent, middlewareLoader = default
|
|
|
117
117
|
// If the middleware returned a Rewrite, set the `url` to the pathname of the rewrite
|
|
118
118
|
// NOTE: the header was added to `req` from above
|
|
119
119
|
const rewriteUrl = responseHeaders.get("x-middleware-rewrite");
|
|
120
|
-
let rewritten = false;
|
|
121
120
|
let isExternalRewrite = false;
|
|
122
121
|
let middlewareQueryString = internalEvent.query;
|
|
123
122
|
let newUrl = internalEvent.url;
|
|
124
123
|
if (rewriteUrl) {
|
|
125
124
|
newUrl = rewriteUrl;
|
|
126
|
-
rewritten = true;
|
|
127
125
|
// If not a string, it should probably throw
|
|
128
126
|
if (isExternal(newUrl, internalEvent.headers.host)) {
|
|
129
127
|
isExternalRewrite = true;
|
|
@@ -202,7 +202,9 @@ export function fixCacheHeaderForHtmlPages(internalEvent, headers) {
|
|
|
202
202
|
const localizedPath = localizePath(internalEvent);
|
|
203
203
|
// WORKAROUND: `NextServer` does not set cache headers for HTML pages
|
|
204
204
|
// https://opennext.js.org/aws/v2/advanced/workaround#workaround-nextserver-does-not-set-cache-headers-for-html-pages
|
|
205
|
-
|
|
205
|
+
// Requests containing an `x-middleware-prefetch` header must not be cached
|
|
206
|
+
if (HtmlPages.includes(localizedPath) &&
|
|
207
|
+
!internalEvent.headers["x-middleware-prefetch"]) {
|
|
206
208
|
headers[CommonHeaders.CACHE_CONTROL] =
|
|
207
209
|
"public, max-age=0, s-maxage=31536000, must-revalidate";
|
|
208
210
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BuildId, ConfigHeaders, NextConfig, PrerenderManifest, RoutesManifest, } from "../adapters/config/index";
|
|
2
|
-
import { debug } from "../adapters/logger";
|
|
2
|
+
import { debug, error } from "../adapters/logger";
|
|
3
3
|
import { cacheInterceptor } from "./routing/cacheInterceptor";
|
|
4
4
|
import { detectLocale } from "./routing/i18n";
|
|
5
5
|
import { fixDataPage, getNextConfigHeaders, handleFallbackFalse, handleRedirects, handleRewrites, } from "./routing/matcher";
|
|
@@ -32,121 +32,149 @@ function applyMiddlewareHeaders(eventHeaders, middlewareHeaders, setPrefix = tru
|
|
|
32
32
|
});
|
|
33
33
|
}
|
|
34
34
|
export default async function routingHandler(event) {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
35
|
+
try {
|
|
36
|
+
// Add Next geo headers
|
|
37
|
+
for (const [openNextGeoName, nextGeoName] of Object.entries(geoHeaderToNextHeader)) {
|
|
38
|
+
const value = event.headers[openNextGeoName];
|
|
39
|
+
if (value) {
|
|
40
|
+
event.headers[nextGeoName] = value;
|
|
41
|
+
}
|
|
40
42
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
43
|
+
// First we remove internal headers
|
|
44
|
+
// We don't want to allow users to set these headers
|
|
45
|
+
for (const key of Object.keys(event.headers)) {
|
|
46
|
+
if (key.startsWith(INTERNAL_HEADER_PREFIX) ||
|
|
47
|
+
key.startsWith(MIDDLEWARE_HEADER_PREFIX)) {
|
|
48
|
+
delete event.headers[key];
|
|
49
|
+
}
|
|
48
50
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
let internalEvent = fixDataPage(event, BuildId);
|
|
52
|
-
if ("statusCode" in internalEvent) {
|
|
53
|
-
return internalEvent;
|
|
54
|
-
}
|
|
55
|
-
const redirect = handleRedirects(internalEvent, RoutesManifest.redirects);
|
|
56
|
-
if (redirect) {
|
|
57
|
-
debug("redirect", redirect);
|
|
58
|
-
return redirect;
|
|
59
|
-
}
|
|
60
|
-
const eventOrResult = await handleMiddleware(internalEvent);
|
|
61
|
-
const isResult = "statusCode" in eventOrResult;
|
|
62
|
-
if (isResult) {
|
|
63
|
-
return eventOrResult;
|
|
64
|
-
}
|
|
65
|
-
const middlewareResponseHeaders = eventOrResult.responseHeaders;
|
|
66
|
-
let isExternalRewrite = eventOrResult.isExternalRewrite ?? false;
|
|
67
|
-
// internalEvent is `InternalEvent | MiddlewareEvent`
|
|
68
|
-
internalEvent = eventOrResult;
|
|
69
|
-
if (!isExternalRewrite) {
|
|
70
|
-
// First rewrite to be applied
|
|
71
|
-
const beforeRewrites = handleRewrites(internalEvent, RoutesManifest.rewrites.beforeFiles);
|
|
72
|
-
internalEvent = beforeRewrites.internalEvent;
|
|
73
|
-
isExternalRewrite = beforeRewrites.isExternalRewrite;
|
|
74
|
-
}
|
|
75
|
-
const foundStaticRoute = staticRouteMatcher(internalEvent.rawPath);
|
|
76
|
-
const isStaticRoute = !isExternalRewrite && foundStaticRoute.length > 0;
|
|
77
|
-
if (!(isStaticRoute || isExternalRewrite)) {
|
|
78
|
-
// Second rewrite to be applied
|
|
79
|
-
const afterRewrites = handleRewrites(internalEvent, RoutesManifest.rewrites.afterFiles);
|
|
80
|
-
internalEvent = afterRewrites.internalEvent;
|
|
81
|
-
isExternalRewrite = afterRewrites.isExternalRewrite;
|
|
82
|
-
}
|
|
83
|
-
// We want to run this just before the dynamic route check
|
|
84
|
-
const { event: fallbackEvent, isISR } = handleFallbackFalse(internalEvent, PrerenderManifest);
|
|
85
|
-
internalEvent = fallbackEvent;
|
|
86
|
-
const foundDynamicRoute = dynamicRouteMatcher(internalEvent.rawPath);
|
|
87
|
-
const isDynamicRoute = !isExternalRewrite && foundDynamicRoute.length > 0;
|
|
88
|
-
if (!(isDynamicRoute || isStaticRoute || isExternalRewrite)) {
|
|
89
|
-
// Fallback rewrite to be applied
|
|
90
|
-
const fallbackRewrites = handleRewrites(internalEvent, RoutesManifest.rewrites.fallback);
|
|
91
|
-
internalEvent = fallbackRewrites.internalEvent;
|
|
92
|
-
isExternalRewrite = fallbackRewrites.isExternalRewrite;
|
|
93
|
-
}
|
|
94
|
-
// Api routes are not present in the routes manifest except if they're not behind /api
|
|
95
|
-
// /api even if it's a page route doesn't get generated in the manifest
|
|
96
|
-
// Ideally we would need to properly check api routes here
|
|
97
|
-
const isApiRoute = internalEvent.rawPath === apiPrefix ||
|
|
98
|
-
internalEvent.rawPath.startsWith(`${apiPrefix}/`);
|
|
99
|
-
const isNextImageRoute = internalEvent.rawPath.startsWith("/_next/image");
|
|
100
|
-
const isRouteFoundBeforeAllRewrites = isStaticRoute || isDynamicRoute || isExternalRewrite;
|
|
101
|
-
// If we still haven't found a route, we show the 404 page
|
|
102
|
-
// We need to ensure that rewrites are applied before showing the 404 page
|
|
103
|
-
if (!(isRouteFoundBeforeAllRewrites ||
|
|
104
|
-
isApiRoute ||
|
|
105
|
-
isNextImageRoute ||
|
|
106
|
-
// We need to check again once all rewrites have been applied
|
|
107
|
-
staticRouteMatcher(internalEvent.rawPath).length > 0 ||
|
|
108
|
-
dynamicRouteMatcher(internalEvent.rawPath).length > 0)) {
|
|
109
|
-
internalEvent = {
|
|
110
|
-
...internalEvent,
|
|
111
|
-
rawPath: "/404",
|
|
112
|
-
url: constructNextUrl(internalEvent.url, "/404"),
|
|
113
|
-
headers: {
|
|
114
|
-
...internalEvent.headers,
|
|
115
|
-
"x-middleware-response-cache-control": "private, no-cache, no-store, max-age=0, must-revalidate",
|
|
116
|
-
},
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
if (globalThis.openNextConfig.dangerous?.enableCacheInterception &&
|
|
120
|
-
!("statusCode" in internalEvent)) {
|
|
121
|
-
debug("Cache interception enabled");
|
|
122
|
-
internalEvent = await cacheInterceptor(internalEvent);
|
|
51
|
+
const nextHeaders = getNextConfigHeaders(event, ConfigHeaders);
|
|
52
|
+
let internalEvent = fixDataPage(event, BuildId);
|
|
123
53
|
if ("statusCode" in internalEvent) {
|
|
124
|
-
applyMiddlewareHeaders(internalEvent.headers, {
|
|
125
|
-
...middlewareResponseHeaders,
|
|
126
|
-
...nextHeaders,
|
|
127
|
-
}, false);
|
|
128
54
|
return internalEvent;
|
|
129
55
|
}
|
|
56
|
+
const redirect = handleRedirects(internalEvent, RoutesManifest.redirects);
|
|
57
|
+
if (redirect) {
|
|
58
|
+
debug("redirect", redirect);
|
|
59
|
+
return redirect;
|
|
60
|
+
}
|
|
61
|
+
const eventOrResult = await handleMiddleware(internalEvent);
|
|
62
|
+
const isResult = "statusCode" in eventOrResult;
|
|
63
|
+
if (isResult) {
|
|
64
|
+
return eventOrResult;
|
|
65
|
+
}
|
|
66
|
+
const middlewareResponseHeaders = eventOrResult.responseHeaders;
|
|
67
|
+
let isExternalRewrite = eventOrResult.isExternalRewrite ?? false;
|
|
68
|
+
// internalEvent is `InternalEvent | MiddlewareEvent`
|
|
69
|
+
internalEvent = eventOrResult;
|
|
70
|
+
if (!isExternalRewrite) {
|
|
71
|
+
// First rewrite to be applied
|
|
72
|
+
const beforeRewrites = handleRewrites(internalEvent, RoutesManifest.rewrites.beforeFiles);
|
|
73
|
+
internalEvent = beforeRewrites.internalEvent;
|
|
74
|
+
isExternalRewrite = beforeRewrites.isExternalRewrite;
|
|
75
|
+
}
|
|
76
|
+
const foundStaticRoute = staticRouteMatcher(internalEvent.rawPath);
|
|
77
|
+
const isStaticRoute = !isExternalRewrite && foundStaticRoute.length > 0;
|
|
78
|
+
if (!(isStaticRoute || isExternalRewrite)) {
|
|
79
|
+
// Second rewrite to be applied
|
|
80
|
+
const afterRewrites = handleRewrites(internalEvent, RoutesManifest.rewrites.afterFiles);
|
|
81
|
+
internalEvent = afterRewrites.internalEvent;
|
|
82
|
+
isExternalRewrite = afterRewrites.isExternalRewrite;
|
|
83
|
+
}
|
|
84
|
+
// We want to run this just before the dynamic route check
|
|
85
|
+
const { event: fallbackEvent, isISR } = handleFallbackFalse(internalEvent, PrerenderManifest);
|
|
86
|
+
internalEvent = fallbackEvent;
|
|
87
|
+
const foundDynamicRoute = dynamicRouteMatcher(internalEvent.rawPath);
|
|
88
|
+
const isDynamicRoute = !isExternalRewrite && foundDynamicRoute.length > 0;
|
|
89
|
+
if (!(isDynamicRoute || isStaticRoute || isExternalRewrite)) {
|
|
90
|
+
// Fallback rewrite to be applied
|
|
91
|
+
const fallbackRewrites = handleRewrites(internalEvent, RoutesManifest.rewrites.fallback);
|
|
92
|
+
internalEvent = fallbackRewrites.internalEvent;
|
|
93
|
+
isExternalRewrite = fallbackRewrites.isExternalRewrite;
|
|
94
|
+
}
|
|
95
|
+
// Api routes are not present in the routes manifest except if they're not behind /api
|
|
96
|
+
// /api even if it's a page route doesn't get generated in the manifest
|
|
97
|
+
// Ideally we would need to properly check api routes here
|
|
98
|
+
const isApiRoute = internalEvent.rawPath === apiPrefix ||
|
|
99
|
+
internalEvent.rawPath.startsWith(`${apiPrefix}/`);
|
|
100
|
+
const isNextImageRoute = internalEvent.rawPath.startsWith("/_next/image");
|
|
101
|
+
const isRouteFoundBeforeAllRewrites = isStaticRoute || isDynamicRoute || isExternalRewrite;
|
|
102
|
+
// If we still haven't found a route, we show the 404 page
|
|
103
|
+
// We need to ensure that rewrites are applied before showing the 404 page
|
|
104
|
+
if (!(isRouteFoundBeforeAllRewrites ||
|
|
105
|
+
isApiRoute ||
|
|
106
|
+
isNextImageRoute ||
|
|
107
|
+
// We need to check again once all rewrites have been applied
|
|
108
|
+
staticRouteMatcher(internalEvent.rawPath).length > 0 ||
|
|
109
|
+
dynamicRouteMatcher(internalEvent.rawPath).length > 0)) {
|
|
110
|
+
internalEvent = {
|
|
111
|
+
...internalEvent,
|
|
112
|
+
rawPath: "/404",
|
|
113
|
+
url: constructNextUrl(internalEvent.url, "/404"),
|
|
114
|
+
headers: {
|
|
115
|
+
...internalEvent.headers,
|
|
116
|
+
"x-middleware-response-cache-control": "private, no-cache, no-store, max-age=0, must-revalidate",
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
if (globalThis.openNextConfig.dangerous?.enableCacheInterception &&
|
|
121
|
+
!("statusCode" in internalEvent)) {
|
|
122
|
+
debug("Cache interception enabled");
|
|
123
|
+
internalEvent = await cacheInterceptor(internalEvent);
|
|
124
|
+
if ("statusCode" in internalEvent) {
|
|
125
|
+
applyMiddlewareHeaders(internalEvent.headers, {
|
|
126
|
+
...middlewareResponseHeaders,
|
|
127
|
+
...nextHeaders,
|
|
128
|
+
}, false);
|
|
129
|
+
return internalEvent;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// We apply the headers from the middleware response last
|
|
133
|
+
applyMiddlewareHeaders(internalEvent.headers, {
|
|
134
|
+
...middlewareResponseHeaders,
|
|
135
|
+
...nextHeaders,
|
|
136
|
+
});
|
|
137
|
+
const resolvedRoutes = [
|
|
138
|
+
...foundStaticRoute,
|
|
139
|
+
...foundDynamicRoute,
|
|
140
|
+
];
|
|
141
|
+
debug("resolvedRoutes", resolvedRoutes);
|
|
142
|
+
return {
|
|
143
|
+
internalEvent,
|
|
144
|
+
isExternalRewrite,
|
|
145
|
+
origin: false,
|
|
146
|
+
isISR,
|
|
147
|
+
resolvedRoutes,
|
|
148
|
+
initialURL: event.url,
|
|
149
|
+
locale: NextConfig.i18n
|
|
150
|
+
? detectLocale(internalEvent, NextConfig.i18n)
|
|
151
|
+
: undefined,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
catch (e) {
|
|
155
|
+
error("Error in routingHandler", e);
|
|
156
|
+
// In case of an error, we want to return the 500 page from Next.js
|
|
157
|
+
return {
|
|
158
|
+
internalEvent: {
|
|
159
|
+
type: "core",
|
|
160
|
+
method: "GET",
|
|
161
|
+
rawPath: "/500",
|
|
162
|
+
url: constructNextUrl(event.url, "/500"),
|
|
163
|
+
headers: {
|
|
164
|
+
...event.headers,
|
|
165
|
+
},
|
|
166
|
+
query: event.query,
|
|
167
|
+
cookies: event.cookies,
|
|
168
|
+
remoteAddress: event.remoteAddress,
|
|
169
|
+
},
|
|
170
|
+
isExternalRewrite: false,
|
|
171
|
+
origin: false,
|
|
172
|
+
isISR: false,
|
|
173
|
+
resolvedRoutes: [],
|
|
174
|
+
initialURL: event.url,
|
|
175
|
+
locale: NextConfig.i18n
|
|
176
|
+
? detectLocale(event, NextConfig.i18n)
|
|
177
|
+
: undefined,
|
|
178
|
+
};
|
|
130
179
|
}
|
|
131
|
-
// We apply the headers from the middleware response last
|
|
132
|
-
applyMiddlewareHeaders(internalEvent.headers, {
|
|
133
|
-
...middlewareResponseHeaders,
|
|
134
|
-
...nextHeaders,
|
|
135
|
-
});
|
|
136
|
-
const resolvedRoutes = [
|
|
137
|
-
...foundStaticRoute,
|
|
138
|
-
...foundDynamicRoute,
|
|
139
|
-
];
|
|
140
|
-
debug("resolvedRoutes", resolvedRoutes);
|
|
141
|
-
return {
|
|
142
|
-
internalEvent,
|
|
143
|
-
isExternalRewrite,
|
|
144
|
-
origin: false,
|
|
145
|
-
isISR,
|
|
146
|
-
resolvedRoutes,
|
|
147
|
-
initialURL: event.url,
|
|
148
|
-
locale: NextConfig.i18n
|
|
149
|
-
? detectLocale(internalEvent, NextConfig.i18n)
|
|
150
|
-
: undefined,
|
|
151
|
-
};
|
|
152
180
|
}
|