Skip to content

Commit 5b9369b

Browse files
committed
More closely match spec
1 parent 7d1e67b commit 5b9369b

File tree

2 files changed

+23
-18
lines changed

2 files changed

+23
-18
lines changed

src/index.ts

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@ const domainValueRegExp =
6363
*/
6464
const pathValueRegExp = /^[\u0020-\u003A\u003D-\u007E]*$/;
6565

66+
/**
67+
* RegExp to match max-age-value in RFC 6265 sec 5.6.2
68+
*/
69+
const maxAgeRegExp = /^-?\d+$/;
70+
6671
const __toString = Object.prototype.toString;
6772

6873
const NullObject = /* @__PURE__ */ (() => {
@@ -405,7 +410,10 @@ export function parseSetCookie(str: string, options?: ParseOptions): SetCookie {
405410
const len = str.length;
406411
const endIdx = colonIdx === -1 ? len : colonIdx;
407412
const [name, value] = keyPairSlice(str, 0, endIdx);
408-
const setCookie: SetCookie = { name, value: dec(value) };
413+
const setCookie: SetCookie =
414+
value === undefined
415+
? { name: "", value: dec(name) }
416+
: { name, value: dec(value) };
409417

410418
let index = endIdx + 1;
411419
while (index < len) {
@@ -414,20 +422,13 @@ export function parseSetCookie(str: string, options?: ParseOptions): SetCookie {
414422
const [attr, val] = keyPairSlice(str, index, endIdx);
415423
const name = attr.toLowerCase();
416424

417-
if (name === "max-age") {
418-
const num = Number(val);
419-
if (Number.isInteger(num)) {
420-
setCookie.maxAge = num;
421-
}
425+
if (name === "max-age" && val && maxAgeRegExp.test(val)) {
426+
setCookie.maxAge = Number(val);
422427
} else if (name === "domain") {
423-
if (domainValueRegExp.test(val)) {
424-
setCookie.domain = val;
425-
}
428+
setCookie.domain = val;
426429
} else if (name === "path") {
427-
if (pathValueRegExp.test(val)) {
428-
setCookie.path = val;
429-
}
430-
} else if (name === "expires") {
430+
setCookie.path = val;
431+
} else if (name === "expires" && val) {
431432
const date = new Date(val);
432433
if (Number.isFinite(date.valueOf())) {
433434
setCookie.expires = date;
@@ -438,12 +439,12 @@ export function parseSetCookie(str: string, options?: ParseOptions): SetCookie {
438439
setCookie.secure = true;
439440
} else if (name === "partitioned") {
440441
setCookie.partitioned = true;
441-
} else if (name === "priority") {
442+
} else if (name === "priority" && val) {
442443
const priority = val.toLowerCase();
443444
if (priority === "low" || priority === "medium" || priority === "high") {
444445
setCookie.priority = priority;
445446
}
446-
} else if (name === "samesite") {
447+
} else if (name === "samesite" && val) {
447448
const sameSite = val.toLowerCase();
448449
if (sameSite === "lax" || sameSite === "strict" || sameSite === "none") {
449450
setCookie.sameSite = sameSite;
@@ -481,10 +482,14 @@ function endIndex(str: string, index: number, min: number) {
481482
/**
482483
* Slice out a key=value pair between min to max.
483484
*/
484-
function keyPairSlice(str: string, min: number, max: number): [string, string] {
485+
function keyPairSlice(
486+
str: string,
487+
min: number,
488+
max: number,
489+
): [string, string | undefined] {
485490
const eqIdx = str.indexOf("=", min);
486491
if (eqIdx === -1 || eqIdx > max) {
487-
return [valueSlice(str, min, max), ""];
492+
return [valueSlice(str, min, max), undefined];
488493
}
489494

490495
const key = valueSlice(str, min, eqIdx);

src/parse-set-cookie.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ describe("cookie.parseSetCookie", () => {
1414
});
1515

1616
it("should handle missing equals sign", () => {
17-
expect(parseSetCookie("key")).toEqual({ name: "key", value: "" });
17+
expect(parseSetCookie("value")).toEqual({ name: "", value: "value" });
1818
});
1919

2020
it("should trim whitespace around key and value", () => {

0 commit comments

Comments
 (0)