Skip to content

Commit 9456d8f

Browse files
PandaWorkerPanda
andauthored
perf: optimize validate http token (#4608)
Co-authored-by: Panda <[email protected]>
1 parent 4481850 commit 9456d8f

File tree

1 file changed

+27
-29
lines changed

1 file changed

+27
-29
lines changed

lib/core/util.js

Lines changed: 27 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -666,48 +666,46 @@ function addAbortListener (signal, listener) {
666666
return () => signal.removeListener('abort', listener)
667667
}
668668

669+
const validTokenChars = new Uint8Array([
670+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0-15
671+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16-31
672+
0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, // 32-47 (!"#$%&'()*+,-./)
673+
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48-63 (0-9:;<=>?)
674+
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64-79 (@A-O)
675+
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 80-95 (P-Z[\]^_)
676+
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96-111 (`a-o)
677+
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, // 112-127 (p-z{|}~)
678+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 128-143
679+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 144-159
680+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 160-175
681+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 176-191
682+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 192-207
683+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 208-223
684+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 224-239
685+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 240-255
686+
])
687+
669688
/**
670689
* @see https://tools.ietf.org/html/rfc7230#section-3.2.6
671690
* @param {number} c
672691
* @returns {boolean}
673692
*/
674693
function isTokenCharCode (c) {
675-
switch (c) {
676-
case 0x22:
677-
case 0x28:
678-
case 0x29:
679-
case 0x2c:
680-
case 0x2f:
681-
case 0x3a:
682-
case 0x3b:
683-
case 0x3c:
684-
case 0x3d:
685-
case 0x3e:
686-
case 0x3f:
687-
case 0x40:
688-
case 0x5b:
689-
case 0x5c:
690-
case 0x5d:
691-
case 0x7b:
692-
case 0x7d:
693-
// DQUOTE and "(),/:;<=>?@[\]{}"
694-
return false
695-
default:
696-
// VCHAR %x21-7E
697-
return c >= 0x21 && c <= 0x7e
698-
}
694+
return (validTokenChars[c] === 1)
699695
}
700696

697+
const tokenRegExp = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/
698+
701699
/**
702700
* @param {string} characters
703701
* @returns {boolean}
704702
*/
705703
function isValidHTTPToken (characters) {
706-
if (characters.length === 0) {
707-
return false
708-
}
709-
for (let i = 0; i < characters.length; ++i) {
710-
if (!isTokenCharCode(characters.charCodeAt(i))) {
704+
if (characters.length >= 12) return tokenRegExp.test(characters)
705+
if (characters.length === 0) return false
706+
707+
for (let i = 0; i < characters.length; i++) {
708+
if (validTokenChars[characters.charCodeAt(i)] !== 1) {
711709
return false
712710
}
713711
}

0 commit comments

Comments
 (0)