[PR #383] [MERGED] fix: preserve x-middleware-request-* headers in dev-mode middleware runner #529

Closed
opened 2026-05-06 13:08:35 +02:00 by BreizhHardware · 0 comments

📋 Pull Request Information

Original PR: https://github.com/cloudflare/vinext/pull/383
Author: @NathanDrake2406
Created: 3/9/2026
Status: Merged
Merged: 3/9/2026
Merged by: @james-elicx

Base: mainHead: fix/middleware-request-headers-dev


📝 Commits (2)

  • b7cd1b0 fix: preserve x-middleware-request-* headers in dev-mode middleware runner
  • 00d1d59 fix: let RSC plugin handle fallback rewrites in App Router dev mode

📊 Changes

3 files changed (+77 additions, -5 deletions)

View changed files

📝 packages/vinext/src/index.ts (+4 -0)
📝 packages/vinext/src/server/middleware.ts (+7 -5)
📝 tests/shims.test.ts (+66 -0)

📄 Description

Summary

  • middleware.ts's runMiddleware() stripped ALL x-middleware-* headers, including x-middleware-request-* headers that the dev server (index.ts:2000-2004) needs to unpack into actual request headers
  • This caused NextResponse.next({ request: { headers } }) to silently lose header overrides in Pages Router dev mode, while working correctly in production (the inline codegen in pages-server-entry.ts already preserved them)
  • Aligns the dev runner's header filter to match production: !key.startsWith("x-middleware-") || key.startsWith("x-middleware-request-")
  • Same fix applied to the rewrite path (line 343) which had the same issue

Test plan

  • Added unit tests for dev-mode runMiddleware with mock runner — verifies x-middleware-request-* preserved on both next() and rewrite() paths
  • Existing production runMiddleware test (pages-router.test.ts:1345) still passes
  • All 56 middleware tests in shims.test.ts pass
  • Typecheck, lint, format all clean
  • CI: full Vitest + Playwright E2E suite

🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/cloudflare/vinext/pull/383 **Author:** [@NathanDrake2406](https://github.com/NathanDrake2406) **Created:** 3/9/2026 **Status:** ✅ Merged **Merged:** 3/9/2026 **Merged by:** [@james-elicx](https://github.com/james-elicx) **Base:** `main` ← **Head:** `fix/middleware-request-headers-dev` --- ### 📝 Commits (2) - [`b7cd1b0`](https://github.com/cloudflare/vinext/commit/b7cd1b09239344cfda2b968e90c5645f43dfea72) fix: preserve x-middleware-request-* headers in dev-mode middleware runner - [`00d1d59`](https://github.com/cloudflare/vinext/commit/00d1d59a91fd75ca4f7f57415674d3f3dbd47378) fix: let RSC plugin handle fallback rewrites in App Router dev mode ### 📊 Changes **3 files changed** (+77 additions, -5 deletions) <details> <summary>View changed files</summary> 📝 `packages/vinext/src/index.ts` (+4 -0) 📝 `packages/vinext/src/server/middleware.ts` (+7 -5) 📝 `tests/shims.test.ts` (+66 -0) </details> ### 📄 Description ## Summary - `middleware.ts`'s `runMiddleware()` stripped ALL `x-middleware-*` headers, including `x-middleware-request-*` headers that the dev server (`index.ts:2000-2004`) needs to unpack into actual request headers - This caused `NextResponse.next({ request: { headers } })` to silently lose header overrides in Pages Router dev mode, while working correctly in production (the inline codegen in `pages-server-entry.ts` already preserved them) - Aligns the dev runner's header filter to match production: `!key.startsWith("x-middleware-") || key.startsWith("x-middleware-request-")` - Same fix applied to the rewrite path (line 343) which had the same issue ## Test plan - [x] Added unit tests for dev-mode `runMiddleware` with mock runner — verifies `x-middleware-request-*` preserved on both `next()` and `rewrite()` paths - [x] Existing production `runMiddleware` test (`pages-router.test.ts:1345`) still passes - [x] All 56 middleware tests in `shims.test.ts` pass - [x] Typecheck, lint, format all clean - [x] CI: full Vitest + Playwright E2E suite --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
BreizhHardware 2026-05-06 13:08:35 +02:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/vinext#529
No description provided.