1
1
'use strict' ;
2
2
3
+ const { ERR_INVALID_URI } = require ( 'internal/errors' ) . codes ;
4
+
3
5
const hexTable = new Array ( 256 ) ;
4
6
for ( var i = 0 ; i < 256 ; ++ i )
5
7
hexTable [ i ] = '%' + ( ( i < 16 ? '0' : '' ) + i . toString ( 16 ) ) . toUpperCase ( ) ;
@@ -23,7 +25,72 @@ const isHexTable = [
23
25
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 // ... 256
24
26
] ;
25
27
28
+ function encodeStr ( str , noEscapeTable , hexTable ) {
29
+ const len = str . length ;
30
+ if ( len === 0 )
31
+ return '' ;
32
+
33
+ var out = '' ;
34
+ var lastPos = 0 ;
35
+
36
+ for ( var i = 0 ; i < len ; i ++ ) {
37
+ var c = str . charCodeAt ( i ) ;
38
+
39
+ // ASCII
40
+ if ( c < 0x80 ) {
41
+ if ( noEscapeTable [ c ] === 1 )
42
+ continue ;
43
+ if ( lastPos < i )
44
+ out += str . slice ( lastPos , i ) ;
45
+ lastPos = i + 1 ;
46
+ out += hexTable [ c ] ;
47
+ continue ;
48
+ }
49
+
50
+ if ( lastPos < i )
51
+ out += str . slice ( lastPos , i ) ;
52
+
53
+ // Multi-byte characters ...
54
+ if ( c < 0x800 ) {
55
+ lastPos = i + 1 ;
56
+ out += hexTable [ 0xC0 | ( c >> 6 ) ] +
57
+ hexTable [ 0x80 | ( c & 0x3F ) ] ;
58
+ continue ;
59
+ }
60
+ if ( c < 0xD800 || c >= 0xE000 ) {
61
+ lastPos = i + 1 ;
62
+ out += hexTable [ 0xE0 | ( c >> 12 ) ] +
63
+ hexTable [ 0x80 | ( ( c >> 6 ) & 0x3F ) ] +
64
+ hexTable [ 0x80 | ( c & 0x3F ) ] ;
65
+ continue ;
66
+ }
67
+ // Surrogate pair
68
+ ++ i ;
69
+
70
+ // This branch should never happen because all URLSearchParams entries
71
+ // should already be converted to USVString. But, included for
72
+ // completion's sake anyway.
73
+ if ( i >= len )
74
+ throw new ERR_INVALID_URI ( ) ;
75
+
76
+ var c2 = str . charCodeAt ( i ) & 0x3FF ;
77
+
78
+ lastPos = i + 1 ;
79
+ c = 0x10000 + ( ( ( c & 0x3FF ) << 10 ) | c2 ) ;
80
+ out += hexTable [ 0xF0 | ( c >> 18 ) ] +
81
+ hexTable [ 0x80 | ( ( c >> 12 ) & 0x3F ) ] +
82
+ hexTable [ 0x80 | ( ( c >> 6 ) & 0x3F ) ] +
83
+ hexTable [ 0x80 | ( c & 0x3F ) ] ;
84
+ }
85
+ if ( lastPos === 0 )
86
+ return str ;
87
+ if ( lastPos < len )
88
+ return out + str . slice ( lastPos ) ;
89
+ return out ;
90
+ }
91
+
26
92
module . exports = {
93
+ encodeStr,
27
94
hexTable,
28
95
isHexTable
29
96
} ;
0 commit comments