From 201685bf972a299ce3df3e06daf1b71d20b5f96a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=BCrg=C3=BCn=20Day=C4=B1o=C4=9Flu?= Date: Fri, 12 Jan 2024 13:14:47 +0100 Subject: [PATCH 1/4] refactor setCookies and remove istanbul ignore else --- plugin.js | 23 +++++++++++------------ test/cookie.test.js | 32 ++++++++++++++++++++++++++++++++ types/plugin.d.ts | 6 +----- 3 files changed, 44 insertions(+), 17 deletions(-) diff --git a/plugin.js b/plugin.js index 01a64ca..0b0a5d5 100644 --- a/plugin.js +++ b/plugin.js @@ -70,31 +70,30 @@ function onReqHandlerWrapper (fastify, hook) { } function setCookies (reply) { - let setCookie = reply.getHeader('Set-Cookie') - const setCookieIsUndefined = setCookie === undefined + const setCookieHeader = reply.getHeader('Set-Cookie') + let setCookie - /* istanbul ignore else */ - if (setCookieIsUndefined) { + if (setCookieHeader === undefined) { if (reply[kReplySetCookies].size === 1) { - for (const c of reply[kReplySetCookies].values()) { - reply.header('Set-Cookie', cookie.serialize(c.name, c.value, c.opts)) - } - + // Fast path for single cookie + const c = reply[kReplySetCookies].values().next().value + reply.header('Set-Cookie', cookie.serialize(c.name, c.value, c.opts)) reply[kReplySetCookies].clear() - return } setCookie = [] - } else if (typeof setCookie === 'string') { - setCookie = [setCookie] + } else if (typeof setCookieHeader === 'string') { + setCookie = [setCookieHeader] + } else { + setCookie = setCookieHeader } for (const c of reply[kReplySetCookies].values()) { setCookie.push(cookie.serialize(c.name, c.value, c.opts)) } - if (!setCookieIsUndefined) reply.removeHeader('Set-Cookie') + if (setCookieHeader !== undefined) reply.removeHeader('Set-Cookie') reply.header('Set-Cookie', setCookie) reply[kReplySetCookies].clear() } diff --git a/test/cookie.test.js b/test/cookie.test.js index b05faad..e1f0b47 100644 --- a/test/cookie.test.js +++ b/test/cookie.test.js @@ -132,6 +132,38 @@ test('should set multiple cookies', (t) => { }) }) +test('should set multiple cookies (an array already exists)', (t) => { + t.plan(10) + const fastify = Fastify() + fastify.register(plugin) + + fastify.get('/test1', (req, reply) => { + reply + .header('Set-Cookie', ['bar=bar']) + .setCookie('foo', 'foo', { path: '/' }) + .send({ hello: 'world' }) + }) + + fastify.inject({ + method: 'GET', + url: '/test1' + }, (err, res) => { + t.error(err) + t.equal(res.statusCode, 200) + t.same(JSON.parse(res.body), { hello: 'world' }) + + const cookies = res.cookies + t.equal(cookies.length, 2) + t.equal(cookies[0].name, 'bar') + t.equal(cookies[0].value, 'bar') + t.equal(cookies[0].path, undefined) + + t.equal(cookies[1].name, 'foo') + t.equal(cookies[1].value, 'foo') + t.equal(cookies[1].path, '/') + }) +}) + test('cookies get set correctly with millisecond dates', (t) => { t.plan(8) const fastify = Fastify() diff --git a/types/plugin.d.ts b/types/plugin.d.ts index 8cc7a9c..0f973fd 100644 --- a/types/plugin.d.ts +++ b/types/plugin.d.ts @@ -65,11 +65,7 @@ declare module "fastify" { * @param value Cookie value * @param options Serialize options */ - setCookie( - name: string, - value: string, - options?: fastifyCookie.CookieSerializeOptions - ): this; + setCookie: setCookieWrapper; /** * @alias setCookie From 2f91107168eb58bf7259e1f83d382b45547b7339 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=BCrg=C3=BCn=20Day=C4=B1o=C4=9Flu?= Date: Fri, 12 Jan 2024 13:22:35 +0100 Subject: [PATCH 2/4] remove redundant condition --- plugin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin.js b/plugin.js index 0b0a5d5..130a113 100644 --- a/plugin.js +++ b/plugin.js @@ -93,7 +93,7 @@ function setCookies (reply) { setCookie.push(cookie.serialize(c.name, c.value, c.opts)) } - if (setCookieHeader !== undefined) reply.removeHeader('Set-Cookie') + reply.removeHeader('Set-Cookie') reply.header('Set-Cookie', setCookie) reply[kReplySetCookies].clear() } From acf2a0520c056af8f33148aa2d5bb24d0132e0bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=BCrg=C3=BCn=20Day=C4=B1o=C4=9Flu?= Date: Fri, 12 Jan 2024 13:30:54 +0100 Subject: [PATCH 3/4] update test --- test/cookie.test.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/cookie.test.js b/test/cookie.test.js index e1f0b47..b045747 100644 --- a/test/cookie.test.js +++ b/test/cookie.test.js @@ -141,6 +141,7 @@ test('should set multiple cookies (an array already exists)', (t) => { reply .header('Set-Cookie', ['bar=bar']) .setCookie('foo', 'foo', { path: '/' }) + .setCookie('foo', 'foo', { path: '/path' }) .send({ hello: 'world' }) }) @@ -153,14 +154,14 @@ test('should set multiple cookies (an array already exists)', (t) => { t.same(JSON.parse(res.body), { hello: 'world' }) const cookies = res.cookies - t.equal(cookies.length, 2) + t.equal(cookies.length, 3) t.equal(cookies[0].name, 'bar') t.equal(cookies[0].value, 'bar') t.equal(cookies[0].path, undefined) t.equal(cookies[1].name, 'foo') t.equal(cookies[1].value, 'foo') - t.equal(cookies[1].path, '/') + t.equal(cookies[2].path, '/path') }) }) From 0479a092565d585a5c05f4cd2a825a1c5fff858a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=BCrg=C3=BCn=20Day=C4=B1o=C4=9Flu?= Date: Fri, 12 Jan 2024 14:23:59 +0100 Subject: [PATCH 4/4] rename variables --- plugin.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/plugin.js b/plugin.js index 130a113..a3a6130 100644 --- a/plugin.js +++ b/plugin.js @@ -70,10 +70,10 @@ function onReqHandlerWrapper (fastify, hook) { } function setCookies (reply) { - const setCookieHeader = reply.getHeader('Set-Cookie') - let setCookie + const setCookieHeaderValue = reply.getHeader('Set-Cookie') + let cookieValue - if (setCookieHeader === undefined) { + if (setCookieHeaderValue === undefined) { if (reply[kReplySetCookies].size === 1) { // Fast path for single cookie const c = reply[kReplySetCookies].values().next().value @@ -82,19 +82,19 @@ function setCookies (reply) { return } - setCookie = [] - } else if (typeof setCookieHeader === 'string') { - setCookie = [setCookieHeader] + cookieValue = [] + } else if (typeof setCookieHeaderValue === 'string') { + cookieValue = [setCookieHeaderValue] } else { - setCookie = setCookieHeader + cookieValue = setCookieHeaderValue } for (const c of reply[kReplySetCookies].values()) { - setCookie.push(cookie.serialize(c.name, c.value, c.opts)) + cookieValue.push(cookie.serialize(c.name, c.value, c.opts)) } reply.removeHeader('Set-Cookie') - reply.header('Set-Cookie', setCookie) + reply.header('Set-Cookie', cookieValue) reply[kReplySetCookies].clear() }