Skip to content

Commit 9e7ca51

Browse files
authored
perf(parse): cache length, return early (#144)
1 parent d6f39b0 commit 9e7ca51

File tree

3 files changed

+14
-8
lines changed

3 files changed

+14
-8
lines changed

benchmark/parse-top.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,6 @@
1212
"support.google.com": "UUU=000=l0llUUlUllU0UlllU0U0U0UlU-Ulll0lUlllU0UUllUUlUUUlllllUUUU-UUllUllU0lUU0U0U00lU0UUlUl0l0lUUlUUUUl0lUU0UUllUlUlUUlUlUUUU0ll0l0UU0lllU0lllUUUU0U0lU0U00l0Ul0UlU-U0UllU00lUUl0U; UUU=000=l0llUUlUllU0UlllU0U0U0UlU-Ulll0lUlllU0UUllUUlUUUlllllUUUU-UUllUllU0lUU0U0U00lU0UUlUl0l0lUUlUUUUl0lUU0UUllUlUlUUlUlUUUU0ll0l0UU0lllU0lllUUUU0U0lU0U00l0Ul0UlU-U0UllU00lUUl0U",
1313
"www.google.com": "0U_UUU=0000-00-00-00; UUU=Ullll0Ullll0U0llUllU00U_lllll0lUUlUl0UllUlUUl0lUlUUUl00UUl; UUU=000=lUU0U0U0U0UllUUUlUUlUUU_UlUll_l0U0UU00lUlUlUlllllUUUl00UllllUU_0ll0UllUllUUU-UUUlllU0UlUlUllUlUllUll00UllU0U00llUUl0lU00lUlUUlllUl_U00UUlU0UU0UllUlUU0lUUlUUUl00lUUlUUUU0ll",
1414
"youtu.be": "UUU=0; UUU=ll0UU-l0lUl; UUUUUUU_UUUU0_UUUU=0_llUUlUllU; UUUUUUU_UUUUUUU_UUUUUUUU=UlUUUlUUUlU%22",
15-
"youtube.com": "UUU=0; UUU=l0_UlUUUlUl; UUUUUUU_UUUU0_UUUU=UUUUlUUUlll; UUUUUUU_UUUUUUU_UUUUUUUU=UlUUUlUUUlU%22"
15+
"youtube.com": "UUU=0; UUU=l0_UlUUUlUl; UUUUUUU_UUUU0_UUUU=UUUUlUUUlll; UUUUUUU_UUUUUUU_UUUUUUUU=UlUUUlUUUlU%22",
16+
"example.com": ""
1617
}

index.js

+8-7
Original file line numberDiff line numberDiff line change
@@ -96,16 +96,17 @@ function parse(str, options) {
9696
}
9797

9898
var obj = {};
99-
var opt = options || {};
100-
var dec = opt.decode || decode;
101-
99+
var len = str.length;
100+
// RFC 6265 sec 4.1.1, RFC 2616 2.2 defines a cookie name consists of one char minimum, plus '='.
101+
var max = len - 2;
102+
if (max < 0) return obj;
103+
104+
var dec = (options && options.decode) || decode;
102105
var index = 0;
103106
var eqIdx = 0;
104107
var endIdx = 0;
105-
var len = str.length;
106-
var max = len - 2;
107108

108-
while (index < max) {
109+
do {
109110
eqIdx = str.indexOf('=', index);
110111

111112
// no more cookie pairs
@@ -142,7 +143,7 @@ function parse(str, options) {
142143
}
143144

144145
index = endIdx + 1
145-
}
146+
} while (index < max);
146147

147148
return obj;
148149
}

test/parse.js

+4
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ describe('cookie.parse(str)', function () {
2727
assert.deepEqual(cookie.parse('foo=; bar='), { foo: '', bar: '' })
2828
})
2929

30+
it('should parse cookie with minimum length', function () {
31+
assert.deepEqual(cookie.parse('f='), { f: '' })
32+
})
33+
3034
it('should URL-decode values', function () {
3135
assert.deepEqual(cookie.parse('foo="bar=123456789&name=Magic+Mouse"'),
3236
{ foo: 'bar=123456789&name=Magic+Mouse' })

0 commit comments

Comments
 (0)