diff --git a/package.json b/package.json index 30c80ee..ab916b4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "better-call", - "version": "1.0.19", + "version": "1.0.20", "packageManager": "pnpm@9.15.0", "type": "module", "repository": { diff --git a/src/cookies.test.ts b/src/cookies.test.ts index aec12fc..2ed1e0b 100644 --- a/src/cookies.test.ts +++ b/src/cookies.test.ts @@ -16,6 +16,21 @@ describe("parseCookies", () => { expect(cookies.get("test")).toBe("test"); expect(cookies.get("test2")).toBe("test 2"); }); + + it("should parse comma-separated cookies from browser environments", () => { + const cookies = parseCookies("test=test, test2=test 2"); + expect(cookies.size).toBe(2); + expect(cookies.get("test")).toBe("test"); + expect(cookies.get("test2")).toBe("test 2"); + }); + + it("should parse mixed comma and semicolon separated cookies", () => { + const cookies = parseCookies("a=1; b=2, c=3,d=4; e=5"); + expect(cookies.size).toBe(5); + expect(cookies.get("a")).toBe("1"); + expect(cookies.get("b")).toBe("2"); + expect(cookies.get("c")).toBe("3"); + }); }); describe("get-cookies", () => { diff --git a/src/cookies.ts b/src/cookies.ts index 3ecfa34..d6f215f 100644 --- a/src/cookies.ts +++ b/src/cookies.ts @@ -118,34 +118,31 @@ export function parseCookies(str: string) { } const cookies: Map = new Map(); + if (!str) { + return cookies; + } - let index = 0; - while (index < str.length) { - const eqIdx = str.indexOf("=", index); + const pairs = str.split(/[;,]\s*/); - if (eqIdx === -1) { - break; - } + for (const pair of pairs) { + const eqIdx = pair.indexOf("="); - let endIdx = str.indexOf(";", index); - - if (endIdx === -1) { - endIdx = str.length; - } else if (endIdx < eqIdx) { - index = str.lastIndexOf(";", eqIdx - 1) + 1; + if (eqIdx === -1) { continue; } - const key = str.slice(index, eqIdx).trim(); + const key = pair.slice(0, eqIdx).trim(); + if (!cookies.has(key)) { - let val = str.slice(eqIdx + 1, endIdx).trim(); + let val = pair.slice(eqIdx + 1).trim(); + if (val.codePointAt(0) === 0x22) { + // 0x22 is the code for " val = val.slice(1, -1); } + cookies.set(key, tryDecode(val)); } - - index = endIdx + 1; } return cookies;