@@ -16,7 +16,7 @@ import {
1616import { sharedConfig } from "solid-js" ;
1717import { renderToString } from "solid-js/web" ;
1818import { 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" ;
2020import invariant from "vinxi/lib/invariant" ;
2121import { cloneEvent , getFetchEvent , mergeResponseHeaders } from "../server/fetchEvent" ;
2222import { 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
272272let 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+ }
273300async 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