Skip to content

Commit 5fd3ae8

Browse files
authored
[backport] Update middleware request header (#77202)
Backports #77201 to v14 release branch
1 parent 756be15 commit 5fd3ae8

File tree

4 files changed

+34
-0
lines changed

4 files changed

+34
-0
lines changed

packages/next/src/server/lib/router-server.ts

+6
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,12 @@ export async function initialize(opts: {
149149
renderServer.instance =
150150
require('./render-server') as typeof import('./render-server')
151151

152+
const randomBytes = new Uint8Array(8)
153+
crypto.getRandomValues(randomBytes)
154+
const middlewareSubrequestId = Buffer.from(randomBytes).toString('hex')
155+
;(globalThis as any)[Symbol.for('@next/middleware-subrequest-id')] =
156+
middlewareSubrequestId
157+
152158
const requestHandlerImpl: WorkerRequestHandler = async (req, res) => {
153159
// internal headers should not be honored by the request handler
154160
if (!process.env.NEXT_PRIVATE_TEST_HEADERS) {

packages/next/src/server/lib/server-ipc/utils.ts

+11
Original file line numberDiff line numberDiff line change
@@ -57,5 +57,16 @@ export const filterInternalHeaders = (
5757
if (INTERNAL_HEADERS.includes(header)) {
5858
delete headers[header]
5959
}
60+
61+
// If this request didn't origin from this session we filter
62+
// out the "x-middleware-subrequest" header so we don't skip
63+
// middleware incorrectly
64+
if (
65+
header === 'x-middleware-subrequest' &&
66+
headers['x-middleware-subrequest-id'] !==
67+
(globalThis as any)[Symbol.for('@next/middleware-subrequest-id')]
68+
) {
69+
delete headers['x-middleware-subrequest']
70+
}
6071
}
6172
}

packages/next/src/server/web/sandbox/context.ts

+4
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,10 @@ Learn More: https://nextjs.org/docs/messages/edge-dynamic-code-evaluation`),
365365
store.headers.get('x-middleware-subrequest') ?? ''
366366
)
367367
}
368+
init.headers.set(
369+
'x-middleware-subrequest-id',
370+
(globalThis as any)[Symbol.for('@next/middleware-subrequest-id')]
371+
)
368372

369373
const prevs =
370374
init.headers.get(`x-middleware-subrequest`)?.split(':') || []

test/e2e/middleware-general/test/index.test.ts

+13
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,19 @@ describe('Middleware Runtime', () => {
102102
}
103103

104104
function runTests({ i18n }: { i18n?: boolean }) {
105+
it('should filter request header properly', async () => {
106+
const res = await next.fetch('/redirect-to-somewhere', {
107+
headers: {
108+
'x-middleware-subrequest':
109+
'middleware:middleware:middleware:middleware:middleware',
110+
},
111+
redirect: 'manual',
112+
})
113+
114+
expect(res.status).toBe(307)
115+
expect(res.headers.get('location')).toContain('/somewhere')
116+
})
117+
105118
it('should handle 404 on fallback: false route correctly', async () => {
106119
const res = await next.fetch('/ssg-fallback-false/first')
107120
expect(res.status).toBe(200)

0 commit comments

Comments
 (0)