11'use strict' ;
22
3+ const { ERR_INVALID_URI } = require ( 'internal/errors' ) . codes ;
4+
35const hexTable = new Array ( 256 ) ;
46for ( var i = 0 ; i < 256 ; ++ i )
57 hexTable [ i ] = '%' + ( ( i < 16 ? '0' : '' ) + i . toString ( 16 ) ) . toUpperCase ( ) ;
@@ -23,7 +25,72 @@ const isHexTable = [
2325 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 // ... 256
2426] ;
2527
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+
2692module . exports = {
93+ encodeStr,
2794 hexTable,
2895 isHexTable
2996} ;
0 commit comments