From 9e7ca51ade4b325307eedd6b4dec190983e9e2cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20Gro=C3=9F?= Date: Thu, 3 Oct 2024 00:25:59 +0200 Subject: [PATCH] perf(parse): cache length, return early (#144) --- benchmark/parse-top.json | 3 ++- index.js | 15 ++++++++------- test/parse.js | 4 ++++ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/benchmark/parse-top.json b/benchmark/parse-top.json index 0530aa9..125b695 100644 --- a/benchmark/parse-top.json +++ b/benchmark/parse-top.json @@ -12,5 +12,6 @@ "support.google.com": "UUU=000=l0llUUlUllU0UlllU0U0U0UlU-Ulll0lUlllU0UUllUUlUUUlllllUUUU-UUllUllU0lUU0U0U00lU0UUlUl0l0lUUlUUUUl0lUU0UUllUlUlUUlUlUUUU0ll0l0UU0lllU0lllUUUU0U0lU0U00l0Ul0UlU-U0UllU00lUUl0U; UUU=000=l0llUUlUllU0UlllU0U0U0UlU-Ulll0lUlllU0UUllUUlUUUlllllUUUU-UUllUllU0lUU0U0U00lU0UUlUl0l0lUUlUUUUl0lUU0UUllUlUlUUlUlUUUU0ll0l0UU0lllU0lllUUUU0U0lU0U00l0Ul0UlU-U0UllU00lUUl0U", "www.google.com": "0U_UUU=0000-00-00-00; UUU=Ullll0Ullll0U0llUllU00U_lllll0lUUlUl0UllUlUUl0lUlUUUl00UUl; UUU=000=lUU0U0U0U0UllUUUlUUlUUU_UlUll_l0U0UU00lUlUlUlllllUUUl00UllllUU_0ll0UllUllUUU-UUUlllU0UlUlUllUlUllUll00UllU0U00llUUl0lU00lUlUUlllUl_U00UUlU0UU0UllUlUU0lUUlUUUl00lUUlUUUU0ll", "youtu.be": "UUU=0; UUU=ll0UU-l0lUl; UUUUUUU_UUUU0_UUUU=0_llUUlUllU; UUUUUUU_UUUUUUU_UUUUUUUU=UlUUUlUUUlU%22", - "youtube.com": "UUU=0; UUU=l0_UlUUUlUl; UUUUUUU_UUUU0_UUUU=UUUUlUUUlll; UUUUUUU_UUUUUUU_UUUUUUUU=UlUUUlUUUlU%22" + "youtube.com": "UUU=0; UUU=l0_UlUUUlUl; UUUUUUU_UUUU0_UUUU=UUUUlUUUlll; UUUUUUU_UUUUUUU_UUUUUUUU=UlUUUlUUUlU%22", + "example.com": "" } diff --git a/index.js b/index.js index 0eeccaf..3e5162a 100644 --- a/index.js +++ b/index.js @@ -96,16 +96,17 @@ function parse(str, options) { } var obj = {}; - var opt = options || {}; - var dec = opt.decode || decode; - + 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; - var max = len - 2; - while (index < max) { + do { eqIdx = str.indexOf('=', index); // no more cookie pairs @@ -142,7 +143,7 @@ function parse(str, options) { } index = endIdx + 1 - } + } while (index < max); return obj; } diff --git a/test/parse.js b/test/parse.js index c11b4fc..f223b16 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' })