-
-
Notifications
You must be signed in to change notification settings - Fork 2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix: clone Headers before mutating them during prerendering #10030
Conversation
🦋 Changeset detectedLatest commit: a70dc2b The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
It looks like I can hack it with |
Pushed a test which I've confirmed fails on master. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
lgtm. (assuming creating new Response
doesn't cause a streaming response body to get buffered)
@benmccann I'm not sure whether it does- but I don't think that would really matter, because this is only during prerendering, where we're buffering the whole response and writing it out to a file anyway. |
true. Then yeah, this looks good to me |
@Conduitry it looks like this PR will need a rebase |
it won't |
Fixes #10366, related to #10030. According to the `fetch()`-specification, a header can have an `immutable`-guard which will throw a `TypeError` if the header is changed: https://fetch.spec.whatwg.org/#headers-class When using `fetch()`, the spec requires the response header to be `immutable` (see step 12/4): https://fetch.spec.whatwg.org/#fetch-method This is implemented in undici (used by Node.js for native fetch() under the hood): https://github.com/nodejs/undici/blob/22bdbd8c7820035276b4e876daccef513c29f5c4/lib/fetch/headers.js#L234-L239
Fixes #9566.
I'm not sure how best to test this. I didn't see an easy way to make a given
Headers
object immutable, so I guess I'm going to have to call undici for real. If I tryevent.fetch
somewhere and it refers to a local endpoint, that won't result in a real network request, and we won't run into the issue where undici makes the headers immutable. I don't think there's an HTTP server running during prerendering anyway. I'd prefer not to do something likeexport const GET = () => fetch("https://www.google.com/");
in my test. Any ideas?Please don't delete this checklist! Before submitting the PR, please make sure you do the following:
Tests
pnpm test
and lint the project withpnpm lint
andpnpm check
Changesets
pnpm changeset
and following the prompts. Changesets that add features should beminor
and those that fix bugs should bepatch
. Please prefix changeset messages withfeat:
,fix:
, orchore:
.