Yevhen Klymentiev
dark
light
console
darkness
y.klymentiev@gmail.com
Reusable Snippets|Practical utility code for everyday use — custom-built and ready to share

mergeCookieHeaders

Merges two cookie header strings into one. Later cookies override earlier ones by key.

TypeScript
Copied!
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

TypeScript
Copied!
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.

Codebase: Utilities -> Network -> mergeCookieHeaders | Yevhen Klymentiev