From eb37ff35789203844db78cf1abbe163daf32bcd0 Mon Sep 17 00:00:00 2001 From: Edmund Hung Date: Tue, 25 Feb 2025 12:30:17 +0000 Subject: [PATCH 1/3] test if response header is immutable --- .../misc/test/fetch-mock.test.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/fixtures/vitest-pool-workers-examples/misc/test/fetch-mock.test.ts b/fixtures/vitest-pool-workers-examples/misc/test/fetch-mock.test.ts index 4db01193ecca..7bfaa953c9ab 100644 --- a/fixtures/vitest-pool-workers-examples/misc/test/fetch-mock.test.ts +++ b/fixtures/vitest-pool-workers-examples/misc/test/fetch-mock.test.ts @@ -61,6 +61,19 @@ it("intercepts URLs with query parameters with repeated keys", async () => { expect(await response3.text()).toBe("baz"); }); +it("throws if you try to mutate the headers", async () => { + fetchMock + .get("https://example.com") + .intercept({ path: "/" }) + .reply(200, "body"); + + let response = await fetch("https://example.com"); + + expect(() => response.headers.set("foo", "bar")).toThrowError(); + expect(() => response.headers.append("foo", "baz")).toThrowError(); + expect(() => response.headers.delete("foo")).toThrowError(); +}); + describe("AbortSignal", () => { let abortSignalTimeoutMock: MockInstance; From 5f7cd7c0113088bf7ca5e455bc06ec6ec75e34fb Mon Sep 17 00:00:00 2001 From: Edmund Hung Date: Tue, 25 Feb 2025 12:40:14 +0000 Subject: [PATCH 2/3] fix: responses from fetchMock should have immutable headers --- .changeset/vast-trains-joke.md | 5 +++++ .../vitest-pool-workers/src/worker/fetch-mock.ts | 12 ++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 .changeset/vast-trains-joke.md diff --git a/.changeset/vast-trains-joke.md b/.changeset/vast-trains-joke.md new file mode 100644 index 000000000000..0ee39f6563ba --- /dev/null +++ b/.changeset/vast-trains-joke.md @@ -0,0 +1,5 @@ +--- +"@cloudflare/vitest-pool-workers": patch +--- + +fix: responses from `fetchMock` should have immutable headers diff --git a/packages/vitest-pool-workers/src/worker/fetch-mock.ts b/packages/vitest-pool-workers/src/worker/fetch-mock.ts index 3c5e64e0cd30..52179b5a4a3b 100644 --- a/packages/vitest-pool-workers/src/worker/fetch-mock.ts +++ b/packages/vitest-pool-workers/src/worker/fetch-mock.ts @@ -170,7 +170,19 @@ globalThis.fetch = async (input, init) => { statusText: responseStatusText, headers: responseHeaders, }); + const throwImmutableHeaderError = () => { + throw new TypeError("Can't modify immutable headers"); + }; Object.defineProperty(response, "url", { value: url.href }); + Object.defineProperty(response.headers, "set", { + value: throwImmutableHeaderError, + }); + Object.defineProperty(response.headers, "append", { + value: throwImmutableHeaderError, + }); + Object.defineProperty(response.headers, "delete", { + value: throwImmutableHeaderError, + }); responseResolve(response); } else { responseResolve(maybeResponse); From e54d234c1a71e5d23dd9b985e5a76e39f3d8763f Mon Sep 17 00:00:00 2001 From: Edmund Hung Date: Wed, 26 Feb 2025 18:20:31 +0000 Subject: [PATCH 3/3] address feedback --- .../vitest-pool-workers/src/worker/fetch-mock.ts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/packages/vitest-pool-workers/src/worker/fetch-mock.ts b/packages/vitest-pool-workers/src/worker/fetch-mock.ts index 52179b5a4a3b..987b0b17c607 100644 --- a/packages/vitest-pool-workers/src/worker/fetch-mock.ts +++ b/packages/vitest-pool-workers/src/worker/fetch-mock.ts @@ -170,18 +170,14 @@ globalThis.fetch = async (input, init) => { statusText: responseStatusText, headers: responseHeaders, }); - const throwImmutableHeaderError = () => { + const throwImmutableHeadersError = () => { throw new TypeError("Can't modify immutable headers"); }; Object.defineProperty(response, "url", { value: url.href }); - Object.defineProperty(response.headers, "set", { - value: throwImmutableHeaderError, - }); - Object.defineProperty(response.headers, "append", { - value: throwImmutableHeaderError, - }); - Object.defineProperty(response.headers, "delete", { - value: throwImmutableHeaderError, + Object.defineProperties(response.headers, { + set: { value: throwImmutableHeadersError }, + append: { value: throwImmutableHeadersError }, + delete: { value: throwImmutableHeadersError }, }); responseResolve(response); } else {