From 291387ac5f4d28e69c063237492ca506dca0c707 Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Mon, 17 Mar 2025 13:37:27 -0700 Subject: [PATCH] Update middleware request header --- packages/next/src/server/lib/router-server.ts | 6 ++++++ packages/next/src/server/lib/server-ipc/utils.ts | 11 +++++++++++ packages/next/src/server/web/sandbox/context.ts | 4 ++++ test/e2e/middleware-general/test/index.test.ts | 13 +++++++++++++ 4 files changed, 34 insertions(+) diff --git a/packages/next/src/server/lib/router-server.ts b/packages/next/src/server/lib/router-server.ts index fd574f33c86fd..60cb6e99e7e07 100644 --- a/packages/next/src/server/lib/router-server.ts +++ b/packages/next/src/server/lib/router-server.ts @@ -166,6 +166,12 @@ export async function initialize(opts: { renderServer.instance = require('./render-server') as typeof import('./render-server') + const randomBytes = new Uint8Array(8) + crypto.getRandomValues(randomBytes) + const middlewareSubrequestId = Buffer.from(randomBytes).toString('hex') + ;(globalThis as any)[Symbol.for('@next/middleware-subrequest-id')] = + middlewareSubrequestId + const allowedOrigins = ['localhost', ...(config.allowedDevOrigins || [])] if (opts.hostname) { allowedOrigins.push(opts.hostname) diff --git a/packages/next/src/server/lib/server-ipc/utils.ts b/packages/next/src/server/lib/server-ipc/utils.ts index 09dee95773625..0b82fdb3f8df9 100644 --- a/packages/next/src/server/lib/server-ipc/utils.ts +++ b/packages/next/src/server/lib/server-ipc/utils.ts @@ -57,5 +57,16 @@ export const filterInternalHeaders = ( if (INTERNAL_HEADERS.includes(header)) { delete headers[header] } + + // If this request didn't origin from this session we filter + // out the "x-middleware-subrequest" header so we don't skip + // middleware incorrectly + if ( + header === 'x-middleware-subrequest' && + headers['x-middleware-subrequest-id'] !== + (globalThis as any)[Symbol.for('@next/middleware-subrequest-id')] + ) { + delete headers['x-middleware-subrequest'] + } } } diff --git a/packages/next/src/server/web/sandbox/context.ts b/packages/next/src/server/web/sandbox/context.ts index 8f9d3722eb0ec..0ee0fbc11dc81 100644 --- a/packages/next/src/server/web/sandbox/context.ts +++ b/packages/next/src/server/web/sandbox/context.ts @@ -373,6 +373,10 @@ Learn More: https://nextjs.org/docs/messages/edge-dynamic-code-evaluation`), store.headers.get('x-middleware-subrequest') ?? '' ) } + init.headers.set( + 'x-middleware-subrequest-id', + (globalThis as any)[Symbol.for('@next/middleware-subrequest-id')] + ) const prevs = init.headers.get(`x-middleware-subrequest`)?.split(':') || [] diff --git a/test/e2e/middleware-general/test/index.test.ts b/test/e2e/middleware-general/test/index.test.ts index 00977bbbedc22..7e50d4386ee07 100644 --- a/test/e2e/middleware-general/test/index.test.ts +++ b/test/e2e/middleware-general/test/index.test.ts @@ -144,6 +144,19 @@ describe('Middleware Runtime', () => { } } + it('should filter request header properly', async () => { + const res = await next.fetch('/redirect-to-somewhere', { + headers: { + 'x-middleware-subrequest': + 'middleware:middleware:middleware:middleware:middleware', + }, + redirect: 'manual', + }) + + expect(res.status).toBe(307) + expect(res.headers.get('location')).toContain('/somewhere') + }) + it('should handle 404 on fallback: false route correctly', async () => { const res = await next.fetch('/ssg-fallback-false/first') expect(res.status).toBe(200)