@@ -57,8 +57,17 @@ export const ctx: CTX = {
57
57
if ( partial . headers === null ) {
58
58
store . headers = new Headers ( ) ;
59
59
} else if ( partial . headers && store . headers instanceof Headers ) {
60
- for ( const [ k , v ] of new Headers ( partial . headers ) . entries ( ) ) {
61
- store . headers . set ( k , v ) ;
60
+ for ( const [ key , value ] of new Headers ( partial . headers ) . entries ( ) ) {
61
+ if ( key . toLowerCase ( ) === 'cookie' ) {
62
+ const existingCookies = parseCookieHeader (
63
+ store . headers . get ( 'cookie' ) || ''
64
+ ) ;
65
+ const newCookies = parseCookieHeader ( value ) ;
66
+ const mergedCookies = { ...existingCookies , ...newCookies } ;
67
+ store . headers . set ( 'cookie' , serializeCookies ( mergedCookies ) ) ;
68
+ } else {
69
+ store . headers . set ( key , value ) ;
70
+ }
62
71
}
63
72
}
64
73
@@ -148,3 +157,21 @@ function serializeContext(context: Context): string {
148
157
preserveHeaders : context . preserveHeaders ,
149
158
} ) ;
150
159
}
160
+
161
+ function parseCookieHeader ( header : string ) : Record < string , string > {
162
+ return header
163
+ . split ( ';' )
164
+ . map ( ( c ) => c . trim ( ) )
165
+ . filter ( Boolean )
166
+ . reduce ( ( acc , curr ) => {
167
+ const [ key , ...val ] = curr . split ( '=' ) ;
168
+ if ( key ) acc [ key ] = val . join ( '=' ) ;
169
+ return acc ;
170
+ } , { } as Record < string , string > ) ;
171
+ }
172
+
173
+ function serializeCookies ( cookies : Record < string , string > ) : string {
174
+ return Object . entries ( cookies )
175
+ . map ( ( [ k , v ] ) => `${ k } =${ v } ` )
176
+ . join ( '; ' ) ;
177
+ }
0 commit comments