Skip to content

Commit e0c0eff

Browse files
feat: add back HttpHeader (#2017)
Co-authored-by: Brendan Allan <brendonovich@outlook.com>
1 parent 1bcba01 commit e0c0eff

4 files changed

Lines changed: 64 additions & 1 deletion

File tree

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { expect, test } from "@playwright/test";
2+
3+
test.describe("http header", () => {
4+
// couldn't get this to see the headers but verified in chrome devtools
5+
test.skip("should set http header", async ({ page }) => {
6+
const response = await page.goto("/http-header");
7+
8+
expect(response?.headers()["test-header"]).toBe("test-value");
9+
});
10+
});
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { HttpHeader } from "@solidjs/start";
2+
3+
export default function HttpHeaderRoute() {
4+
return (
5+
<main>
6+
<h1>Http Header</h1>
7+
<HttpHeader name="test-header" value="test-value" />
8+
</main>
9+
);
10+
}

packages/start/src/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@ export type {
1010
HandlerOptions,
1111
PageEvent,
1212
ResponseStub,
13-
ServerFunctionMeta,
13+
ServerFunctionMeta
1414
} from "./server/types.ts";
1515
export { default as clientOnly } from "./shared/clientOnly.ts";
1616
export { GET } from "./shared/GET.ts";
17+
export { HttpHeader } from "./shared/HttpHeader.tsx";
1718
export { HttpStatusCode } from "./shared/HttpStatusCode.ts";
1819
export { getServerFunctionMeta } from "./shared/serverFunction.ts";
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// @refresh skip
2+
import { onCleanup } from "solid-js";
3+
import { getRequestEvent, isServer } from "solid-js/web";
4+
5+
import type { PageEvent } from "../server/types.ts";
6+
import { appendHeader, setHeader } from "../http/index.ts";
7+
8+
export interface HttpHeaderProps {
9+
name: string;
10+
value: string;
11+
append?: boolean;
12+
}
13+
14+
/**
15+
*
16+
* Read more: https://docs.solidjs.com/solid-start/reference/server/http-header
17+
*/
18+
export const HttpHeader = isServer
19+
? (props: HttpHeaderProps) => {
20+
const event = getRequestEvent() as PageEvent;
21+
22+
if (props.append) appendHeader(props.name, props.value);
23+
else setHeader(props.name, props.value);
24+
25+
onCleanup(() => {
26+
// @ts-expect-error
27+
if (event.nativeEvent.handled || event.complete) return;
28+
const value = event.response.headers.get(props.name);
29+
if (!value) return;
30+
if (!value.includes(", ")) {
31+
if (value === props.value) event.response.headers.delete(props.name);
32+
return;
33+
}
34+
const values = value.split(", ");
35+
const index = values.indexOf(props.value);
36+
index !== -1 && values.splice(index, 1);
37+
if (values.length) event.response.headers.set(props.name, values.join(","));
38+
else event.response.headers.delete(props.name);
39+
});
40+
return null;
41+
}
42+
: (_props: HttpHeaderProps) => null;

0 commit comments

Comments
 (0)