@@ -36,7 +36,8 @@ const {
36
36
URLSearchParams,
37
37
domainToASCII,
38
38
domainToUnicode,
39
- formatSymbol
39
+ formatSymbol,
40
+ encodeStr,
40
41
} = require ( 'internal/url' ) ;
41
42
42
43
// Original url.parse() API
@@ -504,10 +505,27 @@ function urlFormat(urlObject, options) {
504
505
return urlObject . format ( ) ;
505
506
}
506
507
508
+ // These characters do not need escaping:
509
+ // ! - . _ ~
510
+ // ' ( ) * :
511
+ // digits
512
+ // alpha (uppercase)
513
+ // alpha (lowercase)
514
+ const noEscapeAuth = [
515
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , // 0x00 - 0x0F
516
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , // 0x10 - 0x1F
517
+ 0 , 1 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 0 , 0 , 1 , 1 , 0 , // 0x20 - 0x2F
518
+ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , // 0x30 - 0x3F
519
+ 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , // 0x40 - 0x4F
520
+ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 1 , // 0x50 - 0x5F
521
+ 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , // 0x60 - 0x6F
522
+ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 1 , 0 // 0x70 - 0x7F
523
+ ] ;
524
+
507
525
Url . prototype . format = function format ( ) {
508
526
var auth = this . auth || '' ;
509
527
if ( auth ) {
510
- auth = encodeAuth ( auth ) ;
528
+ auth = encodeStr ( auth , noEscapeAuth , hexTable ) ;
511
529
auth += '@' ;
512
530
}
513
531
@@ -890,78 +908,6 @@ Url.prototype.parseHost = function parseHost() {
890
908
if ( host ) this . hostname = host ;
891
909
} ;
892
910
893
- // These characters do not need escaping:
894
- // ! - . _ ~
895
- // ' ( ) * :
896
- // digits
897
- // alpha (uppercase)
898
- // alpha (lowercase)
899
- const noEscapeAuth = [
900
- 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , // 0x00 - 0x0F
901
- 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , // 0x10 - 0x1F
902
- 0 , 1 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 0 , 0 , 1 , 1 , 0 , // 0x20 - 0x2F
903
- 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , // 0x30 - 0x3F
904
- 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , // 0x40 - 0x4F
905
- 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 1 , // 0x50 - 0x5F
906
- 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , // 0x60 - 0x6F
907
- 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 1 , 0 // 0x70 - 0x7F
908
- ] ;
909
-
910
- function encodeAuth ( str ) {
911
- // faster encodeURIComponent alternative for encoding auth uri components
912
- var out = '' ;
913
- var lastPos = 0 ;
914
- for ( var i = 0 ; i < str . length ; ++ i ) {
915
- var c = str . charCodeAt ( i ) ;
916
-
917
- // ASCII
918
- if ( c < 0x80 ) {
919
- if ( noEscapeAuth [ c ] === 1 )
920
- continue ;
921
- if ( lastPos < i )
922
- out += str . slice ( lastPos , i ) ;
923
- lastPos = i + 1 ;
924
- out += hexTable [ c ] ;
925
- continue ;
926
- }
927
-
928
- if ( lastPos < i )
929
- out += str . slice ( lastPos , i ) ;
930
-
931
- // Multi-byte characters ...
932
- if ( c < 0x800 ) {
933
- lastPos = i + 1 ;
934
- out += hexTable [ 0xC0 | ( c >> 6 ) ] + hexTable [ 0x80 | ( c & 0x3F ) ] ;
935
- continue ;
936
- }
937
- if ( c < 0xD800 || c >= 0xE000 ) {
938
- lastPos = i + 1 ;
939
- out += hexTable [ 0xE0 | ( c >> 12 ) ] +
940
- hexTable [ 0x80 | ( ( c >> 6 ) & 0x3F ) ] +
941
- hexTable [ 0x80 | ( c & 0x3F ) ] ;
942
- continue ;
943
- }
944
- // Surrogate pair
945
- ++ i ;
946
- var c2 ;
947
- if ( i < str . length )
948
- c2 = str . charCodeAt ( i ) & 0x3FF ;
949
- else
950
- c2 = 0 ;
951
- lastPos = i + 1 ;
952
- c = 0x10000 + ( ( ( c & 0x3FF ) << 10 ) | c2 ) ;
953
- out += hexTable [ 0xF0 | ( c >> 18 ) ] +
954
- hexTable [ 0x80 | ( ( c >> 12 ) & 0x3F ) ] +
955
- hexTable [ 0x80 | ( ( c >> 6 ) & 0x3F ) ] +
956
- hexTable [ 0x80 | ( c & 0x3F ) ] ;
957
- }
958
- if ( lastPos === 0 )
959
- return str ;
960
- if ( lastPos < str . length )
961
- return out + str . slice ( lastPos ) ;
962
- return out ;
963
- }
964
-
965
911
module . exports = {
966
912
// Original API
967
913
Url,
0 commit comments