From e8d7660775155585b3bde376f6e28d752b2dba8d Mon Sep 17 00:00:00 2001 From: Brenley Dueck Date: Sun, 23 Nov 2025 20:42:34 -0600 Subject: [PATCH 1/3] feat: add back HttpHeader --- apps/tests/src/e2e/http-header.test.ts | 10 ++++++ apps/tests/src/routes/http-header.tsx | 10 ++++++ packages/start/src/index.ts | 4 ++- packages/start/src/shared/HttpHeader.tsx | 40 ++++++++++++++++++++++++ 4 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 apps/tests/src/e2e/http-header.test.ts create mode 100644 apps/tests/src/routes/http-header.tsx create mode 100644 packages/start/src/shared/HttpHeader.tsx diff --git a/apps/tests/src/e2e/http-header.test.ts b/apps/tests/src/e2e/http-header.test.ts new file mode 100644 index 000000000..572a77721 --- /dev/null +++ b/apps/tests/src/e2e/http-header.test.ts @@ -0,0 +1,10 @@ +import { expect, test } from "@playwright/test"; + +test.describe("http header", () => { + // couldn't get this to see the headers but verified in chrome devtools + test.skip("should set http header", async ({ page }) => { + const response = await page.goto("/http-header"); + + expect(response?.headers()["test-header"]).toBe("test-value"); + }); +}); diff --git a/apps/tests/src/routes/http-header.tsx b/apps/tests/src/routes/http-header.tsx new file mode 100644 index 000000000..1c478f666 --- /dev/null +++ b/apps/tests/src/routes/http-header.tsx @@ -0,0 +1,10 @@ +import { HttpHeader } from "../../../../packages/start/src/shared/HttpHeader"; + +export default function HttpHeaderRoute() { + return ( +
+

Http Header

+ +
+ ); +} \ No newline at end of file diff --git a/packages/start/src/index.ts b/packages/start/src/index.ts index ccde895b2..97d5276c6 100644 --- a/packages/start/src/index.ts +++ b/packages/start/src/index.ts @@ -10,9 +10,11 @@ export type { HandlerOptions, PageEvent, ResponseStub, - ServerFunctionMeta, + ServerFunctionMeta } from "./server/types.ts"; export { default as clientOnly } from "./shared/clientOnly.ts"; export { GET } from "./shared/GET.ts"; +export { HttpHeader } from "./shared/HttpHeader.tsx"; export { HttpStatusCode } from "./shared/HttpStatusCode.ts"; export { getServerFunctionMeta } from "./shared/serverFunction.ts"; + diff --git a/packages/start/src/shared/HttpHeader.tsx b/packages/start/src/shared/HttpHeader.tsx new file mode 100644 index 000000000..36527451b --- /dev/null +++ b/packages/start/src/shared/HttpHeader.tsx @@ -0,0 +1,40 @@ +// @refresh skip +import { onCleanup } from "solid-js"; +import { getRequestEvent, isServer } from "solid-js/web"; +import type { PageEvent } from "../server/types"; + +export interface HttpHeaderProps { + name: string; + value: string; + append?: boolean; +} + +/** + * + * Read more: https://docs.solidjs.com/solid-start/reference/server/http-header + */ +export const HttpHeader = isServer + ? (props: HttpHeaderProps) => { + const event = getRequestEvent() as PageEvent; + + if (props.append) event.response.headers.append(props.name, props.value); + else event.response.headers.set(props.name, props.value); + + onCleanup(() => { + // @ts-expect-error + if (event.nativeEvent.handled || event.complete) return; + const value = event.response.headers.get(props.name); + if (!value) return; + if (!value.includes(", ")) { + if (value === props.value) event.response.headers.delete(props.name); + return; + } + const values = value.split(", "); + const index = values.indexOf(props.value); + index !== -1 && values.splice(index, 1); + if (values.length) event.response.headers.set(props.name, values.join(",")); + else event.response.headers.delete(props.name); + }); + return null; + } + : (_props: HttpHeaderProps) => null; From 243de91a8bd479e1d418713c66a0a4b2078f89e6 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Mon, 24 Nov 2025 11:54:22 +0800 Subject: [PATCH 2/3] cleanup --- apps/tests/src/routes/http-header.tsx | 6 +++--- packages/start/src/index.ts | 1 - packages/start/src/shared/HttpHeader.tsx | 5 +++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/tests/src/routes/http-header.tsx b/apps/tests/src/routes/http-header.tsx index 1c478f666..a12d99293 100644 --- a/apps/tests/src/routes/http-header.tsx +++ b/apps/tests/src/routes/http-header.tsx @@ -1,10 +1,10 @@ -import { HttpHeader } from "../../../../packages/start/src/shared/HttpHeader"; +import { HttpHeader } from "@solidjs/start"; export default function HttpHeaderRoute() { return (
-

Http Header

+

Http Header

); -} \ No newline at end of file +} diff --git a/packages/start/src/index.ts b/packages/start/src/index.ts index 97d5276c6..be39a77a3 100644 --- a/packages/start/src/index.ts +++ b/packages/start/src/index.ts @@ -17,4 +17,3 @@ export { GET } from "./shared/GET.ts"; export { HttpHeader } from "./shared/HttpHeader.tsx"; export { HttpStatusCode } from "./shared/HttpStatusCode.ts"; export { getServerFunctionMeta } from "./shared/serverFunction.ts"; - diff --git a/packages/start/src/shared/HttpHeader.tsx b/packages/start/src/shared/HttpHeader.tsx index 36527451b..656a6b40a 100644 --- a/packages/start/src/shared/HttpHeader.tsx +++ b/packages/start/src/shared/HttpHeader.tsx @@ -2,6 +2,7 @@ import { onCleanup } from "solid-js"; import { getRequestEvent, isServer } from "solid-js/web"; import type { PageEvent } from "../server/types"; +import { appendHeader, setHeader } from "../http"; export interface HttpHeaderProps { name: string; @@ -17,8 +18,8 @@ export const HttpHeader = isServer ? (props: HttpHeaderProps) => { const event = getRequestEvent() as PageEvent; - if (props.append) event.response.headers.append(props.name, props.value); - else event.response.headers.set(props.name, props.value); + if (props.append) appendHeader(props.name, props.value); + else setHeader(props.name, props.value); onCleanup(() => { // @ts-expect-error From 9be41a25d1c9ad94aad23c1aec718d1f33491cf4 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Mon, 24 Nov 2025 11:56:42 +0800 Subject: [PATCH 3/3] add extensions --- packages/start/src/shared/HttpHeader.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/start/src/shared/HttpHeader.tsx b/packages/start/src/shared/HttpHeader.tsx index 656a6b40a..30e061a4c 100644 --- a/packages/start/src/shared/HttpHeader.tsx +++ b/packages/start/src/shared/HttpHeader.tsx @@ -1,8 +1,9 @@ // @refresh skip import { onCleanup } from "solid-js"; import { getRequestEvent, isServer } from "solid-js/web"; -import type { PageEvent } from "../server/types"; -import { appendHeader, setHeader } from "../http"; + +import type { PageEvent } from "../server/types.ts"; +import { appendHeader, setHeader } from "../http/index.ts"; export interface HttpHeaderProps { name: string;