Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,29 @@ function fastifyCookieClearCookie (reply, name, options) {
return fastifyCookieSetCookie(reply, name, '', opts)
}

function fastifyCookieGetCookie (reply, name) {
parseCookies(reply.server, reply.request, reply)

for (const c of reply[kReplySetCookies].values()) {
if (c.name === name) {
return Object.assign({ value: c.value }, c.opts)
}
}

return undefined
}

function fastifyCookieGetCookies (reply) {
parseCookies(reply.server, reply.request, reply)

const result = {}
for (const c of reply[kReplySetCookies].values()) {
result[c.name] = Object.assign({ value: c.value }, c.opts)
Comment on lines +85 to +87
}

return result
}

function parseCookies (fastify, request, reply) {
if (reply[kReplySetCookies]) return

Expand Down Expand Up @@ -168,6 +191,8 @@ async function plugin (fastify, options) {
fastify.decorateReply('cookie', setCookie)
fastify.decorateReply('setCookie', setCookie)
fastify.decorateReply('clearCookie', clearCookie)
fastify.decorateReply('getCookie', getCookie)
fastify.decorateReply('getCookies', getCookies)

if (hook) {
fastify.addHook(hook, onReqHandlerWrapper(fastify, hook))
Expand Down Expand Up @@ -200,6 +225,14 @@ async function plugin (fastify, options) {
const opts = Object.assign({}, options.parseOptions, cookieOptions)
return fastifyCookieClearCookie(this, name, opts)
}

function getCookie (name) {
return fastifyCookieGetCookie(this, name)
}

function getCookies () {
return fastifyCookieGetCookies(this)
}
}

function getHook (hook = 'onRequest') {
Expand Down
31 changes: 31 additions & 0 deletions test/cookie.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -1333,3 +1333,34 @@ test('do not crash if the onRequest hook is not run', async (t) => {
t.assert.strictEqual(res.statusCode, 200)
t.assert.deepStrictEqual(JSON.parse(res.body), { hello: 'world' })
})

test('reply.getCookie and reply.getCookies return cookies set on reply', async (t) => {
t.plan(7)

const fastify = Fastify()
fastify.register(plugin)

fastify.get('/test', (req, reply) => {
t.assert.strictEqual(reply.getCookie('foo'), undefined)
t.assert.deepStrictEqual(reply.getCookies(), {})

reply.setCookie('foo', 'bar', { path: '/test', httpOnly: true })
reply.setCookie('baz', 'qux', { secure: true })

const foo = reply.getCookie('foo')
t.assert.deepStrictEqual(foo, { value: 'bar', sameSite: 'lax', path: '/test', httpOnly: true })

const cookies = reply.getCookies()
t.assert.deepStrictEqual(cookies.foo, { value: 'bar', sameSite: 'lax', path: '/test', httpOnly: true })
t.assert.deepStrictEqual(cookies.baz, { value: 'qux', sameSite: 'lax', secure: true })

reply.send('done')
})

const res = await fastify.inject({
method: 'GET',
url: '/test'
})
t.assert.strictEqual(res.statusCode, 200)
t.assert.strictEqual(res.body, 'done')
})
11 changes: 11 additions & 0 deletions types/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,17 @@ declare module 'fastify' {
options?: fastifyCookie.CookieSerializeOptions
): this;

/**
* Get response cookie
* @param name Cookie name
*/
getCookie(name: string): ({ value: string } & fastifyCookie.CookieSerializeOptions) | undefined;

/**
* Get all response cookies
*/
getCookies(): { [key: string]: { value: string } & fastifyCookie.CookieSerializeOptions };

/**
* Unsigns the specified cookie using the secret provided.
* @param value Cookie value
Expand Down
7 changes: 7 additions & 0 deletions types/index.tst.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,13 @@ server.after((_err) => {
.clearCookie('foo')
.send({ hello: 'world' })
).type.toBe<FastifyReply>()

expect(reply.getCookie('test')).type.toBe<
({ value: string } & fastifyCookieStar.CookieSerializeOptions) | undefined
>()
expect(reply.getCookies()).type.toBe<{
[key: string]: { value: string } & fastifyCookieStar.CookieSerializeOptions;
}>()
})

expect(server.signCookie).type.toBe<(value: string) => string>()
Expand Down