diff --git a/HISTORY.md b/HISTORY.md index ce080e0..421e4a8 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,3 +1,9 @@ +unreleased +================== + + * Add support for reading multiple cookies with same name + - This feature can be turned on by `multiValuedCookies` flag + 0.4.1 / 2020-04-21 ================== diff --git a/README.md b/README.md index 18b2c2c..2f3f8cb 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,11 @@ sequences into their byte representations. **note** if an error is thrown from this function, the original, non-decoded cookie value will be returned as the cookie's value. +##### multiValuedCookies + +Specifies a boolean flag which if set to `true` would allow reading multiple cookies with same name (key). All values will be put into an array. +By default (when `multiValuedCookies` isn't present or set to `false`), only first cookie's value is read which is not in accordance with [RFC 6265](https://tools.ietf.org/html/rfc6265#section-4.2.2) (this behaviour is kept around for backward compatibility reason). + ### cookie.serialize(name, value, options) Serialize a cookie name-value pair into a `Set-Cookie` header string. The `name` argument is the diff --git a/index.js b/index.js index 760f32e..906926d 100644 --- a/index.js +++ b/index.js @@ -38,7 +38,7 @@ var fieldContentRegExp = /^[\u0009\u0020-\u007e\u0080-\u00ff]+$/; * Parse a cookie header. * * Parse the given cookie header string into an object - * The object has the various cookies as keys(names) => values + * The object has the various cookies as keys(names) => values or array of values * * @param {string} str * @param {object} [options] @@ -73,9 +73,15 @@ function parse(str, options) { val = val.slice(1, -1); } - // only assign once + // only assign once unless multiValuedCookies is true if (undefined == obj[key]) { obj[key] = tryDecode(val, dec); + } else if (opt.multiValuedCookies) { + if (typeof obj[key] === 'string') { + obj[key] = [obj[key], tryDecode(val, dec)]; + } else { + obj[key].push(tryDecode(val, dec)); + } } } diff --git a/test/parse.js b/test/parse.js index a48a12e..a1a89cd 100644 --- a/test/parse.js +++ b/test/parse.js @@ -70,3 +70,30 @@ test('assign only once', function() { assert.deepEqual({ foo: '', bar: 'bar' }, cookie.parse('foo=;bar=bar;foo=boo')); }); + +test('multiValuedCookies flag', function () { + assert.deepEqual( + { foo: ["%1", "boo"], bar: "bar" }, + cookie.parse("foo=%1;bar=bar;foo=boo", { + multiValuedCookies: true + }) + ); + assert.deepEqual( + { foo: ["", "boo"], bar: "bar" }, + cookie.parse("foo=;bar=bar;foo=boo", { + multiValuedCookies: true, + }) + ); + assert.deepEqual( + { foo: ["%1", "boo", "bar"], bar: "bar" }, + cookie.parse("foo=%1;bar=bar;foo=boo;foo=bar", { + multiValuedCookies: true, + }) + ); + assert.deepEqual( + { foo: "%1", bar: "bar" }, + cookie.parse("foo=%1;bar=bar", { + multiValuedCookies: true, + }) + ); +});