[PR #128] [MERGED] fix(shims): copy request headers into mutable Headers in headersContextFromRequest #335

Closed
opened 2026-05-06 12:39:16 +02:00 by BreizhHardware · 0 comments

📋 Pull Request Information

Original PR: https://github.com/cloudflare/vinext/pull/128
Author: @harrisrobin
Created: 2/26/2026
Status: Merged
Merged: 3/2/2026
Merged by: @southpolesteve

Base: mainHead: fix/immutable-headers


📝 Commits (1)

  • fea0db5 fix(shims): copy request headers into mutable Headers in headersContextFromRequest

📊 Changes

2 files changed (+27 additions, -1 deletions)

View changed files

📝 packages/vinext/src/shims/headers.ts (+4 -1)
📝 tests/shims.test.ts (+23 -0)

📄 Description

Summary

In Cloudflare Workers, Request.headers is immutable per the Fetch API spec. headersContextFromRequest was storing the original request.headers reference directly in HeadersContext, so when applyMiddlewareRequestHeaders later called ctx.headers.set() (to propagate middleware-modified headers into server component context), Workers threw:

TypeError: Can't modify immutable headers.

This is triggered on every request when middleware returns NextResponse.next({ request: { headers } }) — a common pattern for passing data like x-request-url from middleware to server components.

Fix

Wrap with new Headers(request.headers), which creates an independent mutable copy while preserving all header values.

- headers: request.headers,
+ headers: new Headers(request.headers),

Test plan

  • New test asserting the context holds a mutable copy, not the original Request.headers reference
  • All 2026 existing tests pass
  • Lint: 0 warnings/errors (oxlint)
  • Typecheck: clean (tsgo --noEmit)

/bonk


🔄 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/128 **Author:** [@harrisrobin](https://github.com/harrisrobin) **Created:** 2/26/2026 **Status:** ✅ Merged **Merged:** 3/2/2026 **Merged by:** [@southpolesteve](https://github.com/southpolesteve) **Base:** `main` ← **Head:** `fix/immutable-headers` --- ### 📝 Commits (1) - [`fea0db5`](https://github.com/cloudflare/vinext/commit/fea0db5caaa1b319f2e5af7b6821992f0510d509) fix(shims): copy request headers into mutable Headers in headersContextFromRequest ### 📊 Changes **2 files changed** (+27 additions, -1 deletions) <details> <summary>View changed files</summary> 📝 `packages/vinext/src/shims/headers.ts` (+4 -1) 📝 `tests/shims.test.ts` (+23 -0) </details> ### 📄 Description ## Summary In Cloudflare Workers, `Request.headers` is immutable per the Fetch API spec. `headersContextFromRequest` was storing the original `request.headers` reference directly in `HeadersContext`, so when `applyMiddlewareRequestHeaders` later called `ctx.headers.set()` (to propagate middleware-modified headers into server component context), Workers threw: ``` TypeError: Can't modify immutable headers. ``` This is triggered on every request when middleware returns `NextResponse.next({ request: { headers } })` — a common pattern for passing data like `x-request-url` from middleware to server components. ## Fix Wrap with `new Headers(request.headers)`, which creates an independent mutable copy while preserving all header values. ```diff - headers: request.headers, + headers: new Headers(request.headers), ``` ## Test plan - [x] New test asserting the context holds a mutable copy, not the original `Request.headers` reference - [x] All 2026 existing tests pass - [x] Lint: 0 warnings/errors (`oxlint`) - [x] Typecheck: clean (`tsgo --noEmit`) /bonk --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
BreizhHardware 2026-05-06 12:39:16 +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#335
No description provided.