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. |
benmccann
left a comment
There was a problem hiding this comment.
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
Headersobject immutable, so I guess I'm going to have to call undici for real. If I tryevent.fetchsomewhere 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 testand lint the project withpnpm lintandpnpm checkChangesets
pnpm changesetand following the prompts. Changesets that add features should beminorand those that fix bugs should bepatch. Please prefix changeset messages withfeat:,fix:, orchore:.