diff --git a/src/index.ts b/src/index.ts index 23fe8ea..8bc6c27 100644 --- a/src/index.ts +++ b/src/index.ts @@ -435,7 +435,10 @@ export function parseSetCookie(str: string, options?: ParseOptions): SetCookie { setCookie.path = val; break; case "max-age": - if (val && maxAgeRegExp.test(val)) setCookie.maxAge = Number(val); + if (val && maxAgeRegExp.test(val)) { + const maxAge = Number(val); + if (Number.isFinite(maxAge)) setCookie.maxAge = maxAge; + } break; case "expires": if (!val) break; diff --git a/src/parse-set-cookie.spec.ts b/src/parse-set-cookie.spec.ts index 89d4851..6a7ce96 100644 --- a/src/parse-set-cookie.spec.ts +++ b/src/parse-set-cookie.spec.ts @@ -164,6 +164,22 @@ describe("cookie.parseSetCookie", () => { }); }); + it.each(["9".repeat(310), "-" + "9".repeat(310)])( + "should ignore overflowing max-age %s", + (value) => { + expect(parseSetCookie(`key=value; Max-Age=${value}`)).toEqual({ + name: "key", + value: "value", + }); + }, + ); + + it("should retain the previous max-age when a duplicate overflows", () => { + expect( + parseSetCookie(`key=value; Max-Age=60; Max-Age=${"9".repeat(310)}`), + ).toEqual({ name: "key", value: "value", maxAge: 60 }); + }); + it("should parse negative max-age", () => { expect(parseSetCookie("key=value; Max-Age=-1")).toEqual({ name: "key",