@@ -439,101 +439,39 @@ function validateHostname(self, rest, hostname) {
439
439
}
440
440
}
441
441
442
+ // Escaped characters. Use empty strings to fill up unused entries.
443
+ // Using Array is faster than Object/Map
444
+ const escapedCodes = [
445
+ /*0 - 9*/ '' , '' , '' , '' , '' , '' , '' , '' , '' , '%09' ,
446
+ /*10 - 19*/ '%0A' , '' , '' , '%0D' , '' , '' , '' , '' , '' , '' ,
447
+ /*20 - 29*/ '' , '' , '' , '' , '' , '' , '' , '' , '' , '' ,
448
+ /*30 - 39*/ '' , '' , '%20' , '' , '%22' , '' , '' , '' , '' , '%27' ,
449
+ /*40 - 49*/ '' , '' , '' , '' , '' , '' , '' , '' , '' , '' ,
450
+ /*50 - 59*/ '' , '' , '' , '' , '' , '' , '' , '' , '' , '' ,
451
+ /*60 - 69*/ '%3C' , '' , '%3E' , '' , '' , '' , '' , '' , '' , '' ,
452
+ /*70 - 79*/ '' , '' , '' , '' , '' , '' , '' , '' , '' , '' ,
453
+ /*80 - 89*/ '' , '' , '' , '' , '' , '' , '' , '' , '' , '' ,
454
+ /*90 - 99*/ '' , '' , '%5C' , '' , '%5E' , '' , '%60' , '' , '' , '' ,
455
+ /*100 - 109*/ '' , '' , '' , '' , '' , '' , '' , '' , '' , '' ,
456
+ /*110 - 119*/ '' , '' , '' , '' , '' , '' , '' , '' , '' , '' ,
457
+ /*120 - 125*/ '' , '' , '' , '%7B' , '%7C' , '%7D'
458
+ ] ;
459
+
442
460
// Automatically escape all delimiters and unwise characters from RFC 2396.
443
461
// Also escape single quotes in case of an XSS attack.
444
462
// Return the escaped string.
445
463
function autoEscapeStr ( rest ) {
446
464
var escaped = '' ;
447
465
var lastEscapedPos = 0 ;
448
466
for ( var i = 0 ; i < rest . length ; ++ i ) {
449
- // Manual switching is faster than using a Map/Object.
450
467
// `escaped` contains substring up to the last escaped character.
451
- switch ( rest . charCodeAt ( i ) ) {
452
- case 9 : // '\t'
453
- // Concat if there are ordinary characters in the middle.
454
- if ( i > lastEscapedPos )
455
- escaped += rest . slice ( lastEscapedPos , i ) ;
456
- escaped += '%09' ;
457
- lastEscapedPos = i + 1 ;
458
- break ;
459
- case 10 : // '\n'
460
- if ( i > lastEscapedPos )
461
- escaped += rest . slice ( lastEscapedPos , i ) ;
462
- escaped += '%0A' ;
463
- lastEscapedPos = i + 1 ;
464
- break ;
465
- case 13 : // '\r'
466
- if ( i > lastEscapedPos )
467
- escaped += rest . slice ( lastEscapedPos , i ) ;
468
- escaped += '%0D' ;
469
- lastEscapedPos = i + 1 ;
470
- break ;
471
- case 32 : // ' '
472
- if ( i > lastEscapedPos )
473
- escaped += rest . slice ( lastEscapedPos , i ) ;
474
- escaped += '%20' ;
475
- lastEscapedPos = i + 1 ;
476
- break ;
477
- case 34 : // '"'
478
- if ( i > lastEscapedPos )
479
- escaped += rest . slice ( lastEscapedPos , i ) ;
480
- escaped += '%22' ;
481
- lastEscapedPos = i + 1 ;
482
- break ;
483
- case 39 : // '\''
484
- if ( i > lastEscapedPos )
485
- escaped += rest . slice ( lastEscapedPos , i ) ;
486
- escaped += '%27' ;
487
- lastEscapedPos = i + 1 ;
488
- break ;
489
- case 60 : // '<'
490
- if ( i > lastEscapedPos )
491
- escaped += rest . slice ( lastEscapedPos , i ) ;
492
- escaped += '%3C' ;
493
- lastEscapedPos = i + 1 ;
494
- break ;
495
- case 62 : // '>'
496
- if ( i > lastEscapedPos )
497
- escaped += rest . slice ( lastEscapedPos , i ) ;
498
- escaped += '%3E' ;
499
- lastEscapedPos = i + 1 ;
500
- break ;
501
- case 92 : // '\\'
502
- if ( i > lastEscapedPos )
503
- escaped += rest . slice ( lastEscapedPos , i ) ;
504
- escaped += '%5C' ;
505
- lastEscapedPos = i + 1 ;
506
- break ;
507
- case 94 : // '^'
508
- if ( i > lastEscapedPos )
509
- escaped += rest . slice ( lastEscapedPos , i ) ;
510
- escaped += '%5E' ;
511
- lastEscapedPos = i + 1 ;
512
- break ;
513
- case 96 : // '`'
514
- if ( i > lastEscapedPos )
515
- escaped += rest . slice ( lastEscapedPos , i ) ;
516
- escaped += '%60' ;
517
- lastEscapedPos = i + 1 ;
518
- break ;
519
- case 123 : // '{'
520
- if ( i > lastEscapedPos )
521
- escaped += rest . slice ( lastEscapedPos , i ) ;
522
- escaped += '%7B' ;
523
- lastEscapedPos = i + 1 ;
524
- break ;
525
- case 124 : // '|'
526
- if ( i > lastEscapedPos )
527
- escaped += rest . slice ( lastEscapedPos , i ) ;
528
- escaped += '%7C' ;
529
- lastEscapedPos = i + 1 ;
530
- break ;
531
- case 125 : // '}'
532
- if ( i > lastEscapedPos )
533
- escaped += rest . slice ( lastEscapedPos , i ) ;
534
- escaped += '%7D' ;
535
- lastEscapedPos = i + 1 ;
536
- break ;
468
+ var escapedChar = escapedCodes [ rest . charCodeAt ( i ) ] ;
469
+ if ( escapedChar ) {
470
+ // Concat if there are ordinary characters in the middle.
471
+ if ( i > lastEscapedPos )
472
+ escaped += rest . slice ( lastEscapedPos , i ) ;
473
+ escaped += escapedChar ;
474
+ lastEscapedPos = i + 1 ;
537
475
}
538
476
}
539
477
if ( lastEscapedPos === 0 ) // Nothing has been escaped.
0 commit comments