Skip to content

Commit

Permalink
fix: handle multiple Set-Cookie headers (#74)
Browse files Browse the repository at this point in the history
  • Loading branch information
FlippingBinary authored Oct 10, 2022
1 parent 90e19bd commit 5a6a64f
Show file tree
Hide file tree
Showing 5 changed files with 117 additions and 12 deletions.
10 changes: 4 additions & 6 deletions files/entry.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { installPolyfills } from '@sveltejs/kit/node/polyfills';
import { Server } from 'SERVER';
import { manifest } from 'MANIFEST';
import { splitCookiesFromHeaders } from './headers';

// replaced at build time
const debug = DEBUG;
Expand Down Expand Up @@ -67,16 +68,13 @@ async function toResponse(rendered) {
const { status } = rendered;
const resBody = new Uint8Array(await rendered.arrayBuffer());

/** @type {Record<string, string>} */
const resHeaders = {};
rendered.headers.forEach((value, key) => {
resHeaders[key] = value;
});
const { headers, cookies } = splitCookiesFromHeaders(rendered.headers);

return {
status,
body: resBody,
headers: resHeaders,
headers,
cookies,
isRaw: true
};
}
28 changes: 28 additions & 0 deletions files/headers.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import * as set_cookie_parser from 'set-cookie-parser';

/**
* Splits 'set-cookie' headers into individual cookies
* @param {Headers} headers
* @returns {{
* headers: Record<string, string>,
* cookies: set_cookie_parser.Cookie[]
* }}
*/
export function splitCookiesFromHeaders(headers) {
/** @type {Record<string, string>} */
const resHeaders = {};

/** @type {set_cookie_parser.Cookie[]} */
const resCookies = [];

headers.forEach((value, key) => {
if (key === 'set-cookie') {
const cookieStrings = set_cookie_parser.splitCookiesString(value);
resCookies.push(...set_cookie_parser.parse(cookieStrings));
} else {
resHeaders[key] = value;
}
});

return { headers: resHeaders, cookies: resCookies };
}
28 changes: 23 additions & 5 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,14 @@
"@azure/functions": "^1.2.3",
"@sveltejs/kit": "^1.0.0-next.395",
"@types/node": "^17.0.5",
"@types/set-cookie-parser": "^2.4.2",
"@vitest/coverage-c8": "^0.23.4",
"prettier": "^2.4.1",
"vitest": "^0.23.4"
},
"dependencies": {
"esbuild": "^0.15.7"
"esbuild": "^0.15.7",
"set-cookie-parser": "^2.5.1"
},
"files": [
"files",
Expand Down
59 changes: 59 additions & 0 deletions test/headers.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import { installPolyfills } from '@sveltejs/kit/node/polyfills';
import { expect, describe, test } from 'vitest';
import { splitCookiesFromHeaders } from '../files/headers';

installPolyfills();

describe('header processing', () => {
test('no cookies', () => {
const headers = new Headers();
headers.append('Location', '/');
headers.append('Content-Type', 'application/json');

const cookies = splitCookiesFromHeaders(headers);

expect(cookies).toEqual({
cookies: [],
headers: {
'content-type': 'application/json',
location: '/'
}
});
});

test('multiple cookies', () => {
const headers = new Headers();

// https://httpwg.org/specs/rfc7231.html#http.date
const exp1 = 'Sun, 06 Nov 1994 08:49:37 GMT';
const exp2 = 'Sunday, 06-Nov-94 08:49:37 GMT';
const exp3 = 'Sun Nov 6 08:49:37 1994 GMT';

headers.append('Set-Cookie', `key1=val1; Expires=${exp1}`);
headers.append('Set-Cookie', `key2=val2; Expires=${exp2}`);
headers.append('Set-Cookie', `key3=val3; Expires=${exp3}`);

const cookies = splitCookiesFromHeaders(headers);

expect(cookies).toStrictEqual({
headers: {},
cookies: [
{
expires: new Date('1994-11-06T08:49:37.000Z'),
name: 'key1',
value: 'val1'
},
{
expires: new Date('1994-11-06T08:49:37.000Z'),
name: 'key2',
value: 'val2'
},
{
expires: new Date('1994-11-06T08:49:37.000Z'),
name: 'key3',
value: 'val3'
}
]
});
});
});

0 comments on commit 5a6a64f

Please sign in to comment.