mergeCookieHeaders
Merges two cookie header strings into one. Later cookies override earlier ones by key.
1/**
2 * Merges two cookie header strings into one.
3 * Later cookies override earlier ones by key.
4 *
5 * @param header1 - First cookie header string.
6 * @param header2 - Second cookie header string.
7 * @returns A merged cookie header string.
8 *
9 * @example
10 * mergeCookieHeaders("token=abc", "theme=dark; token=xyz")
11 * // => "token=xyz; theme=dark"
12 */
13export function mergeCookieHeaders(header1: string, header2: string): string {
14 const parse = (header: string): Record<string, string> =>
15 header.split(';')
16 .map(part => part.trim())
17 .filter(Boolean)
18 .reduce((acc, part) => {
19 const [key, ...rest] = part.split('=');
20 if (key) acc[key.trim()] = rest.join('=').trim();
21 return acc;
22 }, {} as Record<string, string>);
23
24 const combined = {
25 ...parse(header1),
26 ...parse(header2),
27 };
28
29 return Object.entries(combined)
30 .map(([key, val]) => `${key}=${val}`)
31 .join('; ');
32}
Key-Based Overwriting
Ensures that cookies from the second header override duplicates from the first, respecting header merging logic.
Whitespace Tolerant Parsing
Trims keys and values, preventing malformed cookie entries due to extra spaces.
Non-Destructive Merge
Safely combines distinct cookies without loss, only overwriting conflicting keys.
Reusable Parsing Logic
Encapsulates the parsing logic within a small helper function, which can be adapted or reused elsewhere.
Tests | Examples
1import { mergeCookieHeaders } from './mergeCookieHeaders';
2
3test('merges two cookie headers', () => {
4 const result = mergeCookieHeaders('a=1; b=2', 'c=3; d=4');
5 expect(result).toBe('a=1; b=2; c=3; d=4');
6});
7
8test('second header overrides keys from first', () => {
9 const result = mergeCookieHeaders('token=abc; theme=light', 'theme=dark; lang=en');
10 expect(result).toBe('token=abc; theme=dark; lang=en');
11});
12
13test('handles extra whitespace', () => {
14 const result = mergeCookieHeaders(' a = 1 ; b = 2 ', ' b=3 ; c=4 ');
15 expect(result).toBe('a=1; b=3; c=4');
16});
17
18test('returns only second header when first is empty', () => {
19 expect(mergeCookieHeaders('', 'x=1; y=2')).toBe('x=1; y=2');
20});
21
22test('returns only first header when second is empty', () => {
23 expect(mergeCookieHeaders('x=1; y=2', '')).toBe('x=1; y=2');
24});
25
26test('returns empty string when both headers are empty', () => {
27 expect(mergeCookieHeaders('', '')).toBe('');
28});
Common Use Cases
Combining Client and Server Cookies
Merge cookies set on the client with those received from a server response before forwarding.
Proxy and Middleware Handling
Modify or augment cookie headers in reverse proxies or API gateways.
Manual HTTP Request Construction
Construct merged cookie headers for fetch or XMLHttpRequest when multiple sources contribute cookies.
Session Replay and Testing
Reconstruct cookie headers during automation or replay of HTTP traffic for debugging.