@@ -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 */
674693function 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 - z A - Z \- 0 - 9 ! # $ % & ' * + . | ~ ] + $ /
698+
701699/**
702700 * @param {string } characters
703701 * @returns {boolean }
704702 */
705703function 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