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