Skip to content
This repository was archived by the owner on Jan 11, 2023. It is now read-only.

Commit 954bcba

Browse files
authored
Merge pull request #460 from sveltejs/cookies
more robust cookies
2 parents 9773781 + 709c999 commit 954bcba

File tree

4 files changed

+23
-26
lines changed

4 files changed

+23
-26
lines changed

templates/src/server/middleware/get_page_handler.ts

+15-13
Original file line numberDiff line numberDiff line change
@@ -93,19 +93,21 @@ export function get_page_handler(
9393
if (include_cookies) {
9494
if (!opts.headers) opts.headers = {};
9595

96-
const str = []
97-
.concat(
98-
cookie.parse(req.headers.cookie || ''),
99-
cookie.parse(opts.headers.cookie || ''),
100-
cookie.parse(res.getHeader('Set-Cookie') || '')
101-
)
102-
.map(cookie => {
103-
return Object.keys(cookie)
104-
.map(name => `${name}=${encodeURIComponent(cookie[name])}`)
105-
.join('; ');
106-
})
107-
.filter(Boolean)
108-
.join(', ');
96+
const cookies = Object.assign(
97+
{},
98+
cookie.parse(req.headers.cookie || ''),
99+
cookie.parse(opts.headers.cookie || '')
100+
);
101+
102+
const set_cookie = res.getHeader('Set-Cookie');
103+
(Array.isArray(set_cookie) ? set_cookie : [set_cookie]).forEach(str => {
104+
const match = /([^=]+)=([^;]+)/.exec(<string>str);
105+
if (match) cookies[match[1]] = match[2];
106+
});
107+
108+
const str = Object.keys(cookies)
109+
.map(key => `${key}=${cookies[key]}`)
110+
.join('; ');
109111

110112
opts.headers.cookie = str;
111113
}

test/app/src/routes/credentials/test.json.js

+5-10
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,15 @@
1+
import cookie from 'cookie';
2+
13
export function get(req, res) {
2-
const cookies = req.headers.cookie
3-
? req.headers.cookie.split(/,\s+/).reduce((cookies, cookie) => {
4-
const [pair] = cookie.split('; ');
5-
const [name, value] = pair.split('=');
6-
cookies[name] = value;
7-
return cookies;
8-
}, {})
9-
: {};
4+
if (req.headers.cookie) {
5+
const cookies = cookie.parse(req.headers.cookie);
106

11-
if (cookies.test) {
127
res.writeHead(200, {
138
'Content-Type': 'application/json'
149
});
1510

1611
res.end(JSON.stringify({
17-
message: cookies.test
12+
message: `a: ${cookies.a}, b: ${cookies.b}, max-age: ${cookies['max-age']}`
1813
}));
1914
} else {
2015
res.writeHead(403, {

test/app/src/server.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ const middlewares = [
4444

4545
// set test cookie
4646
(req, res, next) => {
47-
res.setHeader('Set-Cookie', 'test=woohoo!; Max-Age=3600');
47+
res.setHeader('Set-Cookie', ['a=1; Path=/', 'b=2; Path=/']);
4848
next();
4949
},
5050

test/common/test.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -623,7 +623,7 @@ function run({ mode, basepath = '' }) {
623623
return nightmare.goto(`${base}/credentials?creds=include`)
624624
.page.title()
625625
.then(title => {
626-
assert.equal(title, 'woohoo!');
626+
assert.equal(title, 'a: 1, b: 2, max-age: undefined');
627627
});
628628
});
629629

@@ -641,7 +641,7 @@ function run({ mode, basepath = '' }) {
641641
.wait(100)
642642
.page.title()
643643
.then(title => {
644-
assert.equal(title, 'woohoo!');
644+
assert.equal(title, 'a: 1, b: 2, max-age: undefined');
645645
});
646646
});
647647

0 commit comments

Comments
 (0)