@@ -246,44 +246,44 @@ exports.httpSocketSetup = httpSocketSetup;
246
246
* so take care when making changes to the implementation so that the source
247
247
* code size does not exceed v8's default max_inlined_source_size setting.
248
248
**/
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 ) ] )
259
271
return false ;
260
- if ( ch >= 33 && ch <= 46 )
272
+ if ( val . length < 2 )
261
273
return true ;
262
- if ( ch === 124 || ch === 126 )
274
+ if ( ! validTokens [ val . charCodeAt ( 1 ) ] )
275
+ return false ;
276
+ if ( val . length < 3 )
263
277
return true ;
264
- return false ;
265
- }
266
- function checkIsHttpToken ( val ) {
267
- if ( typeof val !== 'string' || val . length === 0 )
278
+ if ( ! validTokens [ val . charCodeAt ( 2 ) ] )
268
279
return false ;
269
- if ( ! isValidTokenChar ( val . charCodeAt ( 0 ) ) )
280
+ if ( val . length < 4 )
281
+ return true ;
282
+ if ( ! validTokens [ val . charCodeAt ( 3 ) ] )
270
283
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 ) ] )
274
286
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
- }
287
287
}
288
288
return true ;
289
289
}
@@ -299,26 +299,44 @@ exports._checkIsHttpToken = checkIsHttpToken;
299
299
* so take care when making changes to the implementation so that the source
300
300
* code size does not exceed v8's default max_inlined_source_size setting.
301
301
**/
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
+ ] ;
302
320
function checkInvalidHeaderChar ( val ) {
303
321
val += '' ;
304
322
if ( val . length < 1 )
305
323
return false ;
306
- var c = val . charCodeAt ( 0 ) ;
307
- if ( ( c <= 31 && c !== 9 ) || c > 255 || c === 127 )
324
+ if ( ! validHdrChars [ val . charCodeAt ( 0 ) ] )
308
325
return true ;
309
326
if ( val . length < 2 )
310
327
return false ;
311
- c = val . charCodeAt ( 1 ) ;
312
- if ( ( c <= 31 && c !== 9 ) || c > 255 || c === 127 )
328
+ if ( ! validHdrChars [ val . charCodeAt ( 1 ) ] )
313
329
return true ;
314
330
if ( val . length < 3 )
315
331
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 ) ] )
318
337
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 ) ] )
322
340
return true ;
323
341
}
324
342
return false ;
0 commit comments