From 97ada783bd2fbd5c326848c9d741bc19baa61440 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20Gro=C3=9F?= Date: Thu, 14 Jul 2022 16:33:54 +0200 Subject: [PATCH 1/2] perf(parse): cache length, return early --- benchmark/parse-top.json | 3 ++- index.js | 29 ++++++++++++++++++++--------- test/parse.js | 4 ++++ 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/benchmark/parse-top.json b/benchmark/parse-top.json index 37f8677..0d57c85 100644 --- a/benchmark/parse-top.json +++ b/benchmark/parse-top.json @@ -14,5 +14,6 @@ "support.google.com": "UUU=000=llU0lUlllUUlllUUll0U0UUll0UUlUUlU-lUUllU0UllUlUUlUlU0UlUUU_U-UlUU0lUUlUllUlUlUUl00llllUl0lUUUU00Ul0UUlUll0UUUU_UUlUlllUllllU0U0lllllUlU000UllUl--UUU_ll_lllU0UllUUlllU00UlU; UUU=000=llU0lUlllUUlllUUll0U0UUll0UUlUUlU-lUUllU0UllUlUUlUlU0UlUUU_U-UlUU0lUUlUllUlUlUUl00llllUl0lUUUU00Ul0UUlUll0UUUU_UUlUlllUllllU0U0lllllUlU000UllUl--UUU_ll_lllU0UllUUlllU00UlU", "www.google.com": "0U_UUU=0000-00-00-00; UUU=UUUU_UUUlUUUUlUll_lllll0U00UUl0lllUUUUlUU_0_llUl0l0UUlU0_lU; UUU=000=lll0lUlUlllUll00U_lUlUUUUlll0lUlUU0lllUlllUllUUUll0U_U0llUU0UlU0Ull0U_l-_UUl00lUllUl0UUllUlUll0UUllUUUlU0UUlUllUlUUUlUllU-lUUlll0UlU0lUllUUUUlUUUlUlUU0llll_lU0lUlllll_UlUl", "youtu.be": "UUU=0; UUU=UUUUUUUllUU; UUUUUUU_UUUU0_UUUU=00UlUU-UUU0", - "youtube.com": "UUU=0; UUU=lU0lUUUlUll; UUUUUUU_UUUU0_UUUU=0UUUlUllU0l" + "youtube.com": "UUU=0; UUU=lU0lUUUlUll; UUUUUUU_UUUU0_UUUU=0UUUlUllU0l", + "example.com": "" } diff --git a/index.js b/index.js index 9c3d07d..68024b8 100644 --- a/index.js +++ b/index.js @@ -50,33 +50,44 @@ function parse(str, options) { } var obj = {} - var opt = options || {}; - var dec = opt.decode || decode; + var length = str.length + + if (length < 2) { + // RFC 6265 sec 4.1.1, RFC 2616 2.2 defines a cookie name consists of one char minimum, plus '='. + return obj + } + + var dec = (options && options.decode) || decode; var index = 0 - while (index < str.length) { - var eqIdx = str.indexOf('=', index) + var eqIdx = 0 + var endIdx = 0 + var key; + var val; + + do { + eqIdx = str.indexOf('=', index) // no more cookie pairs if (eqIdx === -1) { break } - var endIdx = str.indexOf(';', index) + endIdx = str.indexOf(';', index) if (endIdx === -1) { - endIdx = str.length + endIdx = length } else if (endIdx < eqIdx) { // backtrack on prior semicolon index = str.lastIndexOf(';', eqIdx - 1) + 1 continue } - var key = str.slice(index, eqIdx).trim() + key = str.slice(index, eqIdx).trim() // only assign once if (undefined === obj[key]) { - var val = str.slice(eqIdx + 1, endIdx).trim() + val = str.slice(eqIdx + 1, endIdx).trim() // quoted values if (val.charCodeAt(0) === 0x22) { @@ -87,7 +98,7 @@ function parse(str, options) { } index = endIdx + 1 - } + } while (index < length) return obj; } diff --git a/test/parse.js b/test/parse.js index 76229ca..934af44 100644 --- a/test/parse.js +++ b/test/parse.js @@ -27,6 +27,10 @@ describe('cookie.parse(str)', function () { assert.deepEqual(cookie.parse('foo= ; bar='), { foo: '', bar: '' }) }) + it('should parse cookie with minimum length', function () { + assert.deepEqual(cookie.parse('f='), { f: '' }) + }) + it('should URL-decode values', function () { assert.deepEqual(cookie.parse('foo="bar=123456789&name=Magic+Mouse"'), { foo: 'bar=123456789&name=Magic+Mouse' }) From cbd532204c41a5f1c08803bb4542d583dc0e9307 Mon Sep 17 00:00:00 2001 From: Blake Embrey Date: Wed, 2 Oct 2024 15:18:45 -0700 Subject: [PATCH 2/2] Update index.js --- index.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/index.js b/index.js index b2e214b..3e5162a 100644 --- a/index.js +++ b/index.js @@ -96,17 +96,17 @@ function parse(str, options) { } var obj = {}; + var len = str.length; + // RFC 6265 sec 4.1.1, RFC 2616 2.2 defines a cookie name consists of one char minimum, plus '='. + var max = len - 2; + if (max < 0) return obj; + var dec = (options && options.decode) || decode; - var index = 0; var eqIdx = 0; var endIdx = 0; - var len = str.length; - // RFC 6265 sec 4.1.1, RFC 2616 2.2 defines a cookie name consists of one char minimum, plus '='. - var max = len - 2; - - while (index < max) { + do { eqIdx = str.indexOf('=', index); // no more cookie pairs @@ -143,7 +143,7 @@ function parse(str, options) { } index = endIdx + 1 - } while (index < length) + } while (index < max); return obj; }