Skip to content

Commit 0534792

Browse files
authored
Merge branch 'main' into main
2 parents ad77743 + e0c0eff commit 0534792

7 files changed

Lines changed: 79 additions & 13 deletions

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/package.json

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,14 +61,17 @@
6161
"source-map-js": "^1.2.1",
6262
"srvx": "^0.9.1",
6363
"terracotta": "^1.0.6",
64-
"vite": "7.1.10",
65-
"vite-plugin-solid": "^2.11.9",
66-
"vitest": "^4.0.10"
64+
"vite-plugin-solid": "^2.11.9"
6765
},
6866
"engines": {
6967
"node": ">=22"
7068
},
7169
"devDependencies": {
72-
"@types/babel__core": "^7.20.5"
70+
"@types/babel__core": "^7.20.5",
71+
"vite": "^7.1.10",
72+
"vitest": "^4.0.10"
73+
},
74+
"peerDependencies": {
75+
"vite": "^7"
7376
}
7477
}

packages/start/src/http/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,8 +216,8 @@ export const appendHeader = appendResponseHeader;
216216
export const appendHeaders = appendResponseHeaders;
217217
export const setHeader = setResponseHeader;
218218
export const setHeaders = setResponseHeaders;
219-
export const getHeader = getResponseHeader;
220-
export const getHeaders = getResponseHeaders;
219+
export const getHeader = getRequestHeader;
220+
export const getHeaders = getRequestHeaders;
221221
export const getRequestFingerprint = createWrapperFunction(
222222
h3.getRequestFingerprint,
223223
);

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;

pnpm-lock.yaml

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)