rsnext/test/unit/parse-cookie-string.test.ts
Francis Li 9ab6d3bf84
Fix cookie parsing removing extra = (#44218)
When parsing a cookie, extra `=` characters are removed, when only the
first should be removed.

e.g. with the cookie
`csrf_token_ae6261a96213c493a37ea69489ee39c8bc33a53cda7d95f84efa53146145d09c=lnQptRUO/gpU26e8ZKpGIFHKqtP54vVfR7RBiph8Uc0=`

You would expect:
key:
`csrf_token_ae6261a96213c493a37ea69489ee39c8bc33a53cda7d95f84efa53146145d09c`
value: `lnQptRUO/gpU26e8ZKpGIFHKqtP54vVfR7RBiph8Uc0=`

If you use `split`, it will remove the last `=` in value, so you get:
key:
`csrf_token_ae6261a96213c493a37ea69489ee39c8bc33a53cda7d95f84efa53146145d09c`
value: `lnQptRUO/gpU26e8ZKpGIFHKqtP54vVfR7RBiph8Uc0`

This is because `split` still removes all `=` characters, even if you
use the `limit` parameter to limit it to the first 2 elements (as in the
existing code).

Solution is to not use `split` (I've used `slice` instead)

## Bug

- [x] Related issues linked using `fixes #number`
- [x] Integration tests added
- [x] Errors have a helpful link attached, see
[`contributing.md`](https://github.com/vercel/next.js/blob/canary/contributing.md)
2023-01-03 13:35:15 -08:00

39 lines
1.1 KiB
TypeScript

/* eslint-env jest */
import { parseCookieString } from 'next/dist/server/web/spec-extension/cookies/serialize'
function mapToCookieString(map: Map<string, string>) {
let s = ''
for (const [k, v] of map.entries()) {
s += `${k}=${v};`
}
return s
}
describe('parse cookie string', () => {
it('with a plain value', async () => {
const input = new Map([['foo', 'bar']])
const result = parseCookieString(mapToCookieString(input))
expect(result).toEqual(input)
})
it('with multiple `=`', async () => {
const input = new Map([['foo', 'bar=']])
const result = parseCookieString(mapToCookieString(input))
expect(result).toEqual(input)
})
it('with multiple plain values', async () => {
const input = new Map([
['foo', 'bar'],
['baz', 'qux'],
])
const result = parseCookieString(mapToCookieString(input))
expect(result).toEqual(input)
})
it('with multiple values with `=`', async () => {
const input = new Map([
['foo', 'bar=='],
['baz', '=qux'],
])
const result = parseCookieString(mapToCookieString(input))
expect(result).toEqual(input)
})
})