9ab6d3bf84
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)
39 lines
1.1 KiB
TypeScript
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)
|
|
})
|
|
})
|