Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/shaky-experts-beg.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@cloudflare/vite-plugin": patch
---

Ensure that headers set via `server.headers` in the Vite config are added to HTML asset responses in development.
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { describe, expect, test } from "vitest";
import { getResponse, isBuild } from "../../../__test-utils__";

describe.runIf(!isBuild)(
"adds headers included in Vite's `server.headers` to asset responses in dev",
() => {
test("adds headers to HTML responses", async () => {
const response = await getResponse();
const headers = await response.allHeaders();
expect(headers).toMatchObject({
"custom-string": "string-value",
"custom-string-array": "one, two, three",
"custom-number": "123",
});
});

test("adds headers to non-HTML responses", async () => {
const response = await getResponse("/vite.svg");
const headers = await response.allHeaders();
expect(headers).toMatchObject({
"custom-string": "string-value",
"custom-string-array": "one, two, three",
"custom-number": "123",
});
});
}
);
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
"build": "vite build --app",
"check:types": "tsc --build",
"dev": "vite dev",
"dev:server-headers": "vite dev -c ./vite.config.server-headers.ts",
"preview": "vite preview"
},
"dependencies": {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { cloudflare } from "@cloudflare/vite-plugin";
import react from "@vitejs/plugin-react";
import { defineConfig } from "vite";

export default defineConfig({
server: {
headers: {
"custom-string": "string-value",
"custom-string-array": ["one", "two", "three"],
"custom-number": 123,
},
},
plugins: [react(), cloudflare({ inspectorPort: false, persistState: false })],
});
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import AssetWorker from "@cloudflare/workers-shared/asset-worker";
import { UNKNOWN_HOST } from "../shared";
import type { Env as _Env } from "@cloudflare/workers-shared/asset-worker";
import type { ResolvedConfig } from "vite";

interface Env extends _Env {
__VITE_HTML_EXISTS__: Fetcher;
__VITE_FETCH_HTML__: Fetcher;
__VITE_HEADERS__: string;
}

export default class CustomAssetWorker extends AssetWorker<Env> {
Expand All @@ -13,6 +15,20 @@ export default class CustomAssetWorker extends AssetWorker<Env> {
const modifiedResponse = new Response(response.body, response);
modifiedResponse.headers.delete("ETag");
modifiedResponse.headers.delete("Cache-Control");
// Add headers set via `server.headers` in the Vite config
const viteHeaders = JSON.parse(
this.env.__VITE_HEADERS__
) as ResolvedConfig["server"]["headers"];

for (const [key, value] of Object.entries(viteHeaders)) {
if (Array.isArray(value)) {
for (const item of value) {
modifiedResponse.headers.append(key, item);
}
} else if (value !== undefined) {
modifiedResponse.headers.set(key, String(value));
}
}

return modifiedResponse;
}
Expand Down
1 change: 1 addition & 0 deletions packages/vite-plugin-cloudflare/src/miniflare-options.ts
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,7 @@ export async function getDevMiniflareOptions(config: {
],
bindings: {
CONFIG: assetsConfig,
__VITE_HEADERS__: JSON.stringify(viteDevServer.config.server.headers),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this guaranteed to be defined

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, it gets normalised to an empty object.

},
serviceBindings: {
__VITE_HTML_EXISTS__: async (request) => {
Expand Down
Loading