Skip to content

Commit 2e12201

Browse files
authored
Merge branch 'main' into renovate/netlify-cli-21.x
2 parents a91d7fb + b3ab558 commit 2e12201

File tree

3 files changed

+32
-28
lines changed

3 files changed

+32
-28
lines changed

edge-runtime/lib/middleware.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ export function mergeMiddlewareCookies(middlewareResponse: Response, lambdaReque
6767
const middlewareCookies = middlewareResponse.headers.get('x-middleware-set-cookie')
6868

6969
if (middlewareCookies) {
70+
// Next expects internal headers to be omitted when cookies are set by the middleware
71+
// See: https://github.com/vercel/next.js/blob/005db43079c7b59fd8c2594e8362761dc4cb3211/test/e2e/app-dir/app-middleware/app-middleware.test.ts#L197-L207
72+
middlewareResponse.headers.delete('x-middleware-set-cookie')
73+
7074
// Targets commas that are not followed by whitespace
7175
// See: https://github.com/vercel/next.js/blob/e6145d3a37bb4c7b481fd58e05cdff9046ace8ad/packages/next/src/server/web/spec-extension/response.ts#L58-L66
7276
const regex = new RegExp(/,(?!\s)/)

edge-runtime/lib/response.ts

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -163,25 +163,13 @@ export const buildResponse = async ({
163163

164164
if (rewriteUrl.origin !== baseUrl.origin) {
165165
logger.withFields({ rewrite_url: rewrite }).debug('Rewriting to external url')
166-
let proxyRequest: Request
166+
const proxyRequest = await cloneRequest(rewriteUrl, request)
167167

168168
// Remove Netlify internal headers
169-
const headers = new Headers(
170-
[...request.headers.entries()].filter(([key]) => !key.startsWith('x-nf-')),
171-
)
172-
if (request.body && !request.bodyUsed) {
173-
// This is not ideal, but streaming to an external URL doesn't work
174-
const body = await request.arrayBuffer()
175-
proxyRequest = new Request(rewriteUrl, {
176-
headers,
177-
method: request.method,
178-
body,
179-
})
180-
} else {
181-
proxyRequest = new Request(rewriteUrl, {
182-
headers,
183-
method: request.method,
184-
})
169+
for (const key of request.headers.keys()) {
170+
if (key.startsWith('x-nf-')) {
171+
proxyRequest.headers.delete(key)
172+
}
185173
}
186174

187175
return addMiddlewareHeaders(fetch(proxyRequest, { redirect: 'manual' }), edgeResponse)
@@ -207,7 +195,7 @@ export const buildResponse = async ({
207195
request.headers.set('x-middleware-rewrite', target)
208196

209197
// coookies set in middleware need to be available during the lambda request
210-
const newRequest = new Request(target, request)
198+
const newRequest = await cloneRequest(target, request)
211199
const newRequestCookies = mergeMiddlewareCookies(edgeResponse, newRequest)
212200
if (newRequestCookies) {
213201
newRequest.headers.set('Cookie', newRequestCookies)
@@ -241,7 +229,7 @@ export const buildResponse = async ({
241229
edgeResponse.headers.delete('x-middleware-next')
242230

243231
// coookies set in middleware need to be available during the lambda request
244-
const newRequest = new Request(request)
232+
const newRequest = await cloneRequest(request.url, request)
245233
const newRequestCookies = mergeMiddlewareCookies(edgeResponse, newRequest)
246234
if (newRequestCookies) {
247235
newRequest.headers.set('Cookie', newRequestCookies)
@@ -284,3 +272,13 @@ function normalizeLocalizedTarget({
284272
}
285273
return targetUrl.toString()
286274
}
275+
276+
async function cloneRequest(url, request: Request) {
277+
// This is not ideal, but streaming to an external URL doesn't work
278+
const body = request.body && !request.bodyUsed ? await request.arrayBuffer() : undefined
279+
return new Request(url, {
280+
headers: request.headers,
281+
method: request.method,
282+
body,
283+
})
284+
}

src/build/functions/edge.ts

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ const writeHandlerFile = async (ctx: PluginContext, { matchers, name }: NextDefi
119119

120120
const copyHandlerDependencies = async (
121121
ctx: PluginContext,
122-
{ name, files, wasm }: NextDefinition,
122+
{ name, env, files, wasm }: NextDefinition,
123123
) => {
124124
const srcDir = join(ctx.standaloneDir, ctx.nextDistDir)
125125
const destDir = join(ctx.edgeFunctionsDir, getHandlerName({ name }))
@@ -132,6 +132,11 @@ const copyHandlerDependencies = async (
132132

133133
const outputFile = join(destDir, `server/${name}.js`)
134134

135+
// Prepare environment variables for draft-mode (i.e. __NEXT_PREVIEW_MODE_ID, __NEXT_PREVIEW_MODE_SIGNING_KEY, __NEXT_PREVIEW_MODE_ENCRYPTION_KEY)
136+
for (const [key, value] of Object.entries(env)) {
137+
parts.push(`process.env.${key} = '${value}';`)
138+
}
139+
135140
if (wasm?.length) {
136141
for (const wasmChunk of wasm ?? []) {
137142
const data = await readFile(join(srcDir, wasmChunk.filePath))
@@ -161,16 +166,16 @@ const buildHandlerDefinition = (
161166
ctx: PluginContext,
162167
{ name, matchers, page }: NextDefinition,
163168
): Array<ManifestFunction> => {
164-
const fun = getHandlerName({ name })
165-
const funName = name.endsWith('middleware')
169+
const functionHandlerName = getHandlerName({ name })
170+
const functionName = name.endsWith('middleware')
166171
? 'Next.js Middleware Handler'
167172
: `Next.js Edge Handler: ${page}`
168173
const cache = name.endsWith('middleware') ? undefined : ('manual' as const)
169174
const generator = `${ctx.pluginName}@${ctx.pluginVersion}`
170175

171176
return augmentMatchers(matchers, ctx).map((matcher) => ({
172-
function: fun,
173-
name: funName,
177+
function: functionHandlerName,
178+
name: functionName,
174179
pattern: matcher.regexp,
175180
cache,
176181
generator,
@@ -183,10 +188,7 @@ export const clearStaleEdgeHandlers = async (ctx: PluginContext) => {
183188

184189
export const createEdgeHandlers = async (ctx: PluginContext) => {
185190
const nextManifest = await ctx.getMiddlewareManifest()
186-
const nextDefinitions = [
187-
...Object.values(nextManifest.middleware),
188-
// ...Object.values(nextManifest.functions)
189-
]
191+
const nextDefinitions = [...Object.values(nextManifest.middleware)]
190192
await Promise.all(nextDefinitions.map((def) => createEdgeHandler(ctx, def)))
191193

192194
const netlifyDefinitions = nextDefinitions.flatMap((def) => buildHandlerDefinition(ctx, def))

0 commit comments

Comments
 (0)