Skip to content

Commit 8e0c56c

Browse files
committed
forward set cookies through single-flight
1 parent 0a1cfe7 commit 8e0c56c

4 files changed

Lines changed: 50 additions & 16 deletions

File tree

.changeset/config.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
"example-with-trpc",
2424
"example-with-unocss",
2525
"example-with-vitest",
26-
"solid-start-mdx"
26+
"solid-start-mdx",
27+
"solid-start-docs"
2728
]
2829
}

.changeset/neat-glasses-kneel.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@solidjs/start": patch
3+
---
4+
5+
forward set cookies through single-flight

docs/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"name": "solid-start-docs",
33
"type": "module",
4+
"private": true,
45
"scripts": {
56
"dev": "vinxi dev",
67
"build": "vinxi build",

packages/start/src/runtime/server-handler.ts

Lines changed: 42 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {
1616
import { sharedConfig } from "solid-js";
1717
import { renderToString } from "solid-js/web";
1818
import { provideRequestEvent } from "solid-js/web/storage";
19-
import { eventHandler, setHeader, setResponseStatus, type HTTPEvent } from "vinxi/http";
19+
import { eventHandler, parseCookies, setHeader, setResponseStatus, type HTTPEvent } from "vinxi/http";
2020
import invariant from "vinxi/lib/invariant";
2121
import { cloneEvent, getFetchEvent, mergeResponseHeaders } from "../server/fetchEvent";
2222
import { getExpectedRedirectStatus } from "../server/handler";
@@ -100,19 +100,19 @@ async function handleServerFunction(h3Event: HTTPEvent) {
100100
const json = JSON.parse(args);
101101
(json.t
102102
? (fromJSON(json, {
103-
plugins: [
104-
CustomEventPlugin,
105-
DOMExceptionPlugin,
106-
EventPlugin,
107-
FormDataPlugin,
108-
HeadersPlugin,
109-
ReadableStreamPlugin,
110-
RequestPlugin,
111-
ResponsePlugin,
112-
URLSearchParamsPlugin,
113-
URLPlugin
114-
]
115-
}) as any)
103+
plugins: [
104+
CustomEventPlugin,
105+
DOMExceptionPlugin,
106+
EventPlugin,
107+
FormDataPlugin,
108+
HeadersPlugin,
109+
ReadableStreamPlugin,
110+
RequestPlugin,
111+
ResponsePlugin,
112+
URLSearchParamsPlugin,
113+
URLPlugin
114+
]
115+
}) as any)
116116
: json
117117
).forEach((arg: any) => parsed.push(arg));
118118
}
@@ -270,6 +270,33 @@ function handleNoJS(result: any, request: Request, parsed: any[], thrown?: boole
270270
}
271271

272272
let App: any;
273+
function createSingleFlightHeaders(sourceEvent: FetchEvent) {
274+
// cookie handling logic is pretty simplistic so this might be imperfect
275+
// unclear if h3 internals are available on all platforms but we need a way to
276+
// update request headers on the underlying H3 event.
277+
278+
const headers = new Headers(sourceEvent.request.headers);
279+
const cookies = parseCookies(sourceEvent.nativeEvent);
280+
const SetCookies = sourceEvent.response.headers.getSetCookie();
281+
headers.delete("cookie");
282+
let useH3Internals = false;
283+
if (sourceEvent.nativeEvent.node?.req) {
284+
useH3Internals = true;
285+
sourceEvent.nativeEvent.node.req.headers.cookie = "";
286+
}
287+
SetCookies.forEach((cookie) => {
288+
if (!cookie) return;
289+
const keyValue = cookie.split(";")[0]!;
290+
const [key, value] = keyValue.split("=");
291+
key && value && (cookies[key] = value);
292+
});
293+
Object.entries(cookies).forEach(([key, value]) => {
294+
headers.append("cookie", `${key}=${value}`);
295+
useH3Internals && (sourceEvent.nativeEvent.node.req.headers.cookie += `${key}=${value};`);
296+
})
297+
298+
return headers;
299+
}
273300
async function handleSingleFlight(sourceEvent: FetchEvent, result: any): Promise<Response> {
274301
let revalidate: string[];
275302
let url = new URL(sourceEvent.request.headers.get("referer")!).toString();
@@ -283,7 +310,7 @@ async function handleSingleFlight(sourceEvent: FetchEvent, result: any): Promise
283310
).toString();
284311
}
285312
const event = cloneEvent(sourceEvent) as PageEvent;
286-
event.request = new Request(url, { headers: sourceEvent.request.headers });
313+
event.request = new Request(url, { headers: createSingleFlightHeaders(sourceEvent) });
287314
return await provideRequestEvent(event, async () => {
288315
await createPageEvent(event);
289316
/* @ts-ignore */

0 commit comments

Comments
 (0)