@@ -246,44 +246,44 @@ exports.httpSocketSetup = httpSocketSetup;
246246 * so take care when making changes to the implementation so that the source
247247 * code size does not exceed v8's default max_inlined_source_size setting.
248248 **/
249- function isValidTokenChar(ch) {
250- if (ch >= 94 && ch <= 122)
251- return true;
252- if (ch >= 65 && ch <= 90)
253- return true;
254- if (ch === 45)
255- return true;
256- if (ch >= 48 && ch <= 57)
257- return true;
258- if (ch === 34 || ch === 40 || ch === 41 || ch === 44)
249+ var validTokens = [
250+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 15
251+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 31
252+ 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, // 32 - 47
253+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48 - 63
254+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 79
255+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 80 - 95
256+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 111
257+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, // 112 - 127
258+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 128 ...
259+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
260+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
261+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
262+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
263+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
264+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
265+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // ... 255
266+ ];
267+ function checkIsHttpToken(val) {
268+ if (typeof val !== 'string' || val.length === 0)
269+ return false;
270+ if (!validTokens[val.charCodeAt(0)])
259271 return false;
260- if (ch >= 33 && ch <= 46 )
272+ if (val.length < 2 )
261273 return true;
262- if (ch === 124 || ch === 126)
274+ if (!validTokens[val.charCodeAt(1)])
275+ return false;
276+ if (val.length < 3)
263277 return true;
264- return false;
265- }
266- function checkIsHttpToken(val) {
267- if (typeof val !== 'string' || val.length === 0)
278+ if (!validTokens[val.charCodeAt(2)])
268279 return false;
269- if (!isValidTokenChar(val.charCodeAt(0)))
280+ if (val.length < 4)
281+ return true;
282+ if (!validTokens[val.charCodeAt(3)])
270283 return false;
271- const len = val.length;
272- if (len > 1) {
273- if (!isValidTokenChar(val.charCodeAt(1)))
284+ for (var i = 4; i < val.length; ++i) {
285+ if (!validTokens[val.charCodeAt(i)])
274286 return false;
275- if (len > 2) {
276- if (!isValidTokenChar(val.charCodeAt(2)))
277- return false;
278- if (len > 3) {
279- if (!isValidTokenChar(val.charCodeAt(3)))
280- return false;
281- for (var i = 4; i < len; i++) {
282- if (!isValidTokenChar(val.charCodeAt(i)))
283- return false;
284- }
285- }
286- }
287287 }
288288 return true;
289289}
@@ -299,26 +299,44 @@ exports._checkIsHttpToken = checkIsHttpToken;
299299 * so take care when making changes to the implementation so that the source
300300 * code size does not exceed v8's default max_inlined_source_size setting.
301301 **/
302+ var validHdrChars = [
303+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, // 0 - 15
304+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 31
305+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 32 - 47
306+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 48 - 63
307+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 79
308+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 80 - 95
309+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 111
310+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, // 112 - 127
311+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 128 ...
312+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
313+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
314+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
315+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
316+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
317+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
318+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // ... 255
319+ ];
302320function checkInvalidHeaderChar(val) {
303321 val += '';
304322 if (val.length < 1)
305323 return false;
306- var c = val.charCodeAt(0);
307- if ((c <= 31 && c !== 9) || c > 255 || c === 127)
324+ if (!validHdrChars[val.charCodeAt(0)])
308325 return true;
309326 if (val.length < 2)
310327 return false;
311- c = val.charCodeAt(1);
312- if ((c <= 31 && c !== 9) || c > 255 || c === 127)
328+ if (!validHdrChars[val.charCodeAt(1)])
313329 return true;
314330 if (val.length < 3)
315331 return false;
316- c = val.charCodeAt(2);
317- if ((c <= 31 && c !== 9) || c > 255 || c === 127)
332+ if (!validHdrChars[val.charCodeAt(2)])
333+ return true;
334+ if (val.length < 4)
335+ return false;
336+ if (!validHdrChars[val.charCodeAt(3)])
318337 return true;
319- for (var i = 3; i < val.length; ++i) {
320- c = val.charCodeAt(i);
321- if ((c <= 31 && c !== 9) || c > 255 || c === 127)
338+ for (var i = 4; i < val.length; ++i) {
339+ if (!validHdrChars[val.charCodeAt(i)])
322340 return true;
323341 }
324342 return false;
0 commit comments