Skip to content

Commit 52a078d

Browse files
ijjkhuozhi
authored andcommitted
Update middleware request header (#77201)
This just adds an additional header to our internal filtering list for middleware.
1 parent 4698ad6 commit 52a078d

File tree

4 files changed

+35
-4
lines changed

4 files changed

+35
-4
lines changed

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

+7-4
Original file line numberDiff line numberDiff line change
@@ -166,10 +166,13 @@ export async function initialize(opts: {
166166
renderServer.instance =
167167
require('./render-server') as typeof import('./render-server')
168168

169-
const allowedOrigins = [
170-
'localhost',
171-
...(config.experimental.allowedDevOrigins || []),
172-
]
169+
const randomBytes = new Uint8Array(8)
170+
crypto.getRandomValues(randomBytes)
171+
const middlewareSubrequestId = Buffer.from(randomBytes).toString('hex')
172+
;(globalThis as any)[Symbol.for('@next/middleware-subrequest-id')] =
173+
middlewareSubrequestId
174+
175+
const allowedOrigins = ['localhost', ...(config.allowedDevOrigins || [])]
173176
if (opts.hostname) {
174177
allowedOrigins.push(opts.hostname)
175178
}

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
@@ -373,6 +373,10 @@ Learn More: https://nextjs.org/docs/messages/edge-dynamic-code-evaluation`),
373373
store.headers.get('x-middleware-subrequest') ?? ''
374374
)
375375
}
376+
init.headers.set(
377+
'x-middleware-subrequest-id',
378+
(globalThis as any)[Symbol.for('@next/middleware-subrequest-id')]
379+
)
376380

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

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

+13
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,19 @@ describe('Middleware Runtime', () => {
144144
}
145145
}
146146

147+
it('should filter request header properly', async () => {
148+
const res = await next.fetch('/redirect-to-somewhere', {
149+
headers: {
150+
'x-middleware-subrequest':
151+
'middleware:middleware:middleware:middleware:middleware',
152+
},
153+
redirect: 'manual',
154+
})
155+
156+
expect(res.status).toBe(307)
157+
expect(res.headers.get('location')).toContain('/somewhere')
158+
})
159+
147160
it('should handle 404 on fallback: false route correctly', async () => {
148161
const res = await next.fetch('/ssg-fallback-false/first')
149162
expect(res.status).toBe(200)

0 commit comments

Comments
 (0)