Skip to content

Commit e8d7660

Browse files
committed
feat: add back HttpHeader
1 parent 719ad54 commit e8d7660

4 files changed

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

0 commit comments

Comments
 (0)