From f6d61ba8031be3271d53ba9f2e9b74bacae8bd36 Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Fri, 6 Sep 2024 12:03:29 -0400 Subject: [PATCH] Support 304 responses on document requests --- .changeset/slow-socks-juggle.md | 5 +++++ integration/single-fetch-test.ts | 27 +++++++++++++++++++------ packages/remix-server-runtime/server.ts | 5 +++++ 3 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 .changeset/slow-socks-juggle.md diff --git a/.changeset/slow-socks-juggle.md b/.changeset/slow-socks-juggle.md new file mode 100644 index 00000000000..8f7bc9cf626 --- /dev/null +++ b/.changeset/slow-socks-juggle.md @@ -0,0 +1,5 @@ +--- +"@remix-run/server-runtime": patch +--- + +Support 304 responses on document requests diff --git a/integration/single-fetch-test.ts b/integration/single-fetch-test.ts index 453ebe93db9..359e59c38a3 100644 --- a/integration/single-fetch-test.ts +++ b/integration/single-fetch-test.ts @@ -1897,7 +1897,7 @@ test.describe("single-fetch", () => { ]); }); - test("does not try to encode a turbo-stream body into 304 responses", async () => { + test.only("does not try to encode a turbo-stream body into 304 responses", async () => { let fixture = await createFixture({ config: { future: { @@ -1925,8 +1925,23 @@ test.describe("single-fetch", () => { `, }, }); - let res = await fixture.requestSingleFetchData("/_root.data"); - expect(res.data).toEqual({ + + // Document requests + let documentRes = await fixture.requestDocument("/"); + let html = await documentRes.text(); + expect(html).toContain(""); + expect(html).toContain("

Hello from the loader!

"); + documentRes = await fixture.requestDocument("/", { + headers: { + "If-None-Match": "1234", + }, + }); + expect(documentRes.status).toBe(304); + expect(await documentRes.text()).toBe(""); + + // Data requests + let dataRes = await fixture.requestSingleFetchData("/_root.data"); + expect(dataRes.data).toEqual({ root: { data: { message: "ROOT", @@ -1938,13 +1953,13 @@ test.describe("single-fetch", () => { }, }, }); - res = await fixture.requestSingleFetchData("/_root.data", { + dataRes = await fixture.requestSingleFetchData("/_root.data", { headers: { "If-None-Match": "1234", }, }); - expect(res.status).toBe(304); - expect(res.data).toBeNull(); + expect(dataRes.status).toBe(304); + expect(dataRes.data).toBeNull(); }); test.describe("revalidations/_routes param", () => { diff --git a/packages/remix-server-runtime/server.ts b/packages/remix-server-runtime/server.ts index a28aff97369..14a7f680893 100644 --- a/packages/remix-server-runtime/server.ts +++ b/packages/remix-server-runtime/server.ts @@ -465,6 +465,11 @@ async function handleDocumentRequest( let headers = getDocumentHeaders(build, context); + // 304 responses should not have a body or a content-type + if (context.statusCode === 304) { + return new Response(null, { status: 304, headers }); + } + // Sanitize errors outside of development environments if (context.errors) { Object.values(context.errors).forEach((err) => {