@@ -5,20 +5,44 @@ const {
5
5
hexTable,
6
6
isHexTable
7
7
} = require ( 'internal/querystring' ) ;
8
+
8
9
const { getConstructorOf } = require ( 'internal/util' ) ;
9
10
const errors = require ( 'internal/errors' ) ;
10
- const binding = process . binding ( 'url' ) ;
11
+ const querystring = require ( 'querystring' ) ;
12
+
13
+ const { platform } = process ;
14
+ const isWindows = platform === 'win32' ;
15
+
16
+ const {
17
+ domainToASCII : _domainToASCII ,
18
+ domainToUnicode : _domainToUnicode ,
19
+ encodeAuth,
20
+ toUSVString : _toUSVString ,
21
+ parse : _parse ,
22
+ setURLConstructor,
23
+ URL_FLAGS_CANNOT_BE_BASE ,
24
+ URL_FLAGS_HAS_FRAGMENT ,
25
+ URL_FLAGS_HAS_HOST ,
26
+ URL_FLAGS_HAS_PASSWORD ,
27
+ URL_FLAGS_HAS_PATH ,
28
+ URL_FLAGS_HAS_QUERY ,
29
+ URL_FLAGS_HAS_USERNAME ,
30
+ URL_FLAGS_SPECIAL ,
31
+ kFragment,
32
+ kHost,
33
+ kHostname,
34
+ kPathStart,
35
+ kPort,
36
+ kQuery,
37
+ kSchemeStart
38
+ } = process . binding ( 'url' ) ;
39
+
11
40
const context = Symbol ( 'context' ) ;
12
41
const cannotBeBase = Symbol ( 'cannot-be-base' ) ;
13
42
const cannotHaveUsernamePasswordPort =
14
43
Symbol ( 'cannot-have-username-password-port' ) ;
15
44
const special = Symbol ( 'special' ) ;
16
45
const searchParams = Symbol ( 'query' ) ;
17
- const querystring = require ( 'querystring' ) ;
18
-
19
- const { platform } = process ;
20
- const isWindows = platform === 'win32' ;
21
-
22
46
const kFormat = Symbol ( 'format' ) ;
23
47
24
48
// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object
@@ -35,7 +59,7 @@ function toUSVString(val) {
35
59
const match = unpairedSurrogateRe . exec ( str ) ;
36
60
if ( ! match )
37
61
return str ;
38
- return binding . toUSVString ( str , match . index ) ;
62
+ return _toUSVString ( str , match . index ) ;
39
63
}
40
64
41
65
// Refs: https://html.spec.whatwg.org/multipage/browsers.html#concept-origin-opaque
@@ -74,10 +98,10 @@ function onParseComplete(flags, protocol, username, password,
74
98
var ctx = this [ context ] ;
75
99
ctx . flags = flags ;
76
100
ctx . scheme = protocol ;
77
- ctx . username = ( flags & binding . URL_FLAGS_HAS_USERNAME ) !== 0 ? username : '' ;
78
- ctx . password = ( flags & binding . URL_FLAGS_HAS_PASSWORD ) !== 0 ? password : '' ;
101
+ ctx . username = ( flags & URL_FLAGS_HAS_USERNAME ) !== 0 ? username : '' ;
102
+ ctx . password = ( flags & URL_FLAGS_HAS_PASSWORD ) !== 0 ? password : '' ;
79
103
ctx . port = port ;
80
- ctx . path = ( flags & binding . URL_FLAGS_HAS_PATH ) !== 0 ? path : [ ] ;
104
+ ctx . path = ( flags & URL_FLAGS_HAS_PATH ) !== 0 ? path : [ ] ;
81
105
ctx . query = query ;
82
106
ctx . fragment = fragment ;
83
107
ctx . host = host ;
@@ -98,31 +122,30 @@ function onParseError(flags, input) {
98
122
function parse ( url , input , base ) {
99
123
const base_context = base ? base [ context ] : undefined ;
100
124
url [ context ] = new URLContext ( ) ;
101
- binding . parse ( input . trim ( ) , - 1 ,
102
- base_context , undefined ,
103
- onParseComplete . bind ( url ) , onParseError ) ;
125
+ _parse ( input . trim ( ) , - 1 , base_context , undefined ,
126
+ onParseComplete . bind ( url ) , onParseError ) ;
104
127
}
105
128
106
129
function onParseProtocolComplete ( flags , protocol , username , password ,
107
130
host , port , path , query , fragment ) {
108
131
const ctx = this [ context ] ;
109
- if ( ( flags & binding . URL_FLAGS_SPECIAL ) !== 0 ) {
110
- ctx . flags |= binding . URL_FLAGS_SPECIAL ;
132
+ if ( ( flags & URL_FLAGS_SPECIAL ) !== 0 ) {
133
+ ctx . flags |= URL_FLAGS_SPECIAL ;
111
134
} else {
112
- ctx . flags &= ~ binding . URL_FLAGS_SPECIAL ;
135
+ ctx . flags &= ~ URL_FLAGS_SPECIAL ;
113
136
}
114
137
ctx . scheme = protocol ;
115
138
}
116
139
117
140
function onParseHostComplete ( flags , protocol , username , password ,
118
141
host , port , path , query , fragment ) {
119
142
const ctx = this [ context ] ;
120
- if ( ( flags & binding . URL_FLAGS_HAS_HOST ) !== 0 ) {
143
+ if ( ( flags & URL_FLAGS_HAS_HOST ) !== 0 ) {
121
144
ctx . host = host ;
122
- ctx . flags |= binding . URL_FLAGS_HAS_HOST ;
145
+ ctx . flags |= URL_FLAGS_HAS_HOST ;
123
146
} else {
124
147
ctx . host = null ;
125
- ctx . flags &= ~ binding . URL_FLAGS_HAS_HOST ;
148
+ ctx . flags &= ~ URL_FLAGS_HAS_HOST ;
126
149
}
127
150
if ( port !== null )
128
151
ctx . port = port ;
@@ -131,12 +154,12 @@ function onParseHostComplete(flags, protocol, username, password,
131
154
function onParseHostnameComplete ( flags , protocol , username , password ,
132
155
host , port , path , query , fragment ) {
133
156
const ctx = this [ context ] ;
134
- if ( ( flags & binding . URL_FLAGS_HAS_HOST ) !== 0 ) {
157
+ if ( ( flags & URL_FLAGS_HAS_HOST ) !== 0 ) {
135
158
ctx . host = host ;
136
- ctx . flags |= binding . URL_FLAGS_HAS_HOST ;
159
+ ctx . flags |= URL_FLAGS_HAS_HOST ;
137
160
} else {
138
161
ctx . host = null ;
139
- ctx . flags &= ~ binding . URL_FLAGS_HAS_HOST ;
162
+ ctx . flags &= ~ URL_FLAGS_HAS_HOST ;
140
163
}
141
164
}
142
165
@@ -148,18 +171,18 @@ function onParsePortComplete(flags, protocol, username, password,
148
171
function onParsePathComplete ( flags , protocol , username , password ,
149
172
host , port , path , query , fragment ) {
150
173
const ctx = this [ context ] ;
151
- if ( ( flags & binding . URL_FLAGS_HAS_PATH ) !== 0 ) {
174
+ if ( ( flags & URL_FLAGS_HAS_PATH ) !== 0 ) {
152
175
ctx . path = path ;
153
- ctx . flags |= binding . URL_FLAGS_HAS_PATH ;
176
+ ctx . flags |= URL_FLAGS_HAS_PATH ;
154
177
} else {
155
178
ctx . path = [ ] ;
156
- ctx . flags &= ~ binding . URL_FLAGS_HAS_PATH ;
179
+ ctx . flags &= ~ URL_FLAGS_HAS_PATH ;
157
180
}
158
181
159
182
// The C++ binding may set host to empty string.
160
- if ( ( flags & binding . URL_FLAGS_HAS_HOST ) !== 0 ) {
183
+ if ( ( flags & URL_FLAGS_HAS_HOST ) !== 0 ) {
161
184
ctx . host = host ;
162
- ctx . flags |= binding . URL_FLAGS_HAS_HOST ;
185
+ ctx . flags |= URL_FLAGS_HAS_HOST ;
163
186
}
164
187
}
165
188
@@ -185,11 +208,11 @@ class URL {
185
208
}
186
209
187
210
get [ special ] ( ) {
188
- return ( this [ context ] . flags & binding . URL_FLAGS_SPECIAL ) !== 0 ;
211
+ return ( this [ context ] . flags & URL_FLAGS_SPECIAL ) !== 0 ;
189
212
}
190
213
191
214
get [ cannotBeBase ] ( ) {
192
- return ( this [ context ] . flags & binding . URL_FLAGS_CANNOT_BE_BASE ) !== 0 ;
215
+ return ( this [ context ] . flags & URL_FLAGS_CANNOT_BE_BASE ) !== 0 ;
193
216
}
194
217
195
218
// https://url.spec.whatwg.org/#cannot-have-a-username-password-port
@@ -348,8 +371,8 @@ Object.defineProperties(URL.prototype, {
348
371
( ctx . host === '' || ctx . host === null ) ) {
349
372
return ;
350
373
}
351
- binding . parse ( scheme , binding . kSchemeStart , null , ctx ,
352
- onParseProtocolComplete . bind ( this ) ) ;
374
+ _parse ( scheme , kSchemeStart , null , ctx ,
375
+ onParseProtocolComplete . bind ( this ) ) ;
353
376
}
354
377
} ,
355
378
username : {
@@ -366,11 +389,11 @@ Object.defineProperties(URL.prototype, {
366
389
const ctx = this [ context ] ;
367
390
if ( username === '' ) {
368
391
ctx . username = '' ;
369
- ctx . flags &= ~ binding . URL_FLAGS_HAS_USERNAME ;
392
+ ctx . flags &= ~ URL_FLAGS_HAS_USERNAME ;
370
393
return ;
371
394
}
372
- ctx . username = binding . encodeAuth ( username ) ;
373
- ctx . flags |= binding . URL_FLAGS_HAS_USERNAME ;
395
+ ctx . username = encodeAuth ( username ) ;
396
+ ctx . flags |= URL_FLAGS_HAS_USERNAME ;
374
397
}
375
398
} ,
376
399
password : {
@@ -387,11 +410,11 @@ Object.defineProperties(URL.prototype, {
387
410
const ctx = this [ context ] ;
388
411
if ( password === '' ) {
389
412
ctx . password = '' ;
390
- ctx . flags &= ~ binding . URL_FLAGS_HAS_PASSWORD ;
413
+ ctx . flags &= ~ URL_FLAGS_HAS_PASSWORD ;
391
414
return ;
392
415
}
393
- ctx . password = binding . encodeAuth ( password ) ;
394
- ctx . flags |= binding . URL_FLAGS_HAS_PASSWORD ;
416
+ ctx . password = encodeAuth ( password ) ;
417
+ ctx . flags |= URL_FLAGS_HAS_PASSWORD ;
395
418
}
396
419
} ,
397
420
host : {
@@ -412,8 +435,7 @@ Object.defineProperties(URL.prototype, {
412
435
// Cannot set the host if cannot-be-base is set
413
436
return ;
414
437
}
415
- binding . parse ( host , binding . kHost , null , ctx ,
416
- onParseHostComplete . bind ( this ) ) ;
438
+ _parse ( host , kHost , null , ctx , onParseHostComplete . bind ( this ) ) ;
417
439
}
418
440
} ,
419
441
hostname : {
@@ -430,8 +452,7 @@ Object.defineProperties(URL.prototype, {
430
452
// Cannot set the host if cannot-be-base is set
431
453
return ;
432
454
}
433
- binding . parse ( host , binding . kHostname , null , ctx ,
434
- onParseHostnameComplete . bind ( this ) ) ;
455
+ _parse ( host , kHostname , null , ctx , onParseHostnameComplete . bind ( this ) ) ;
435
456
}
436
457
} ,
437
458
port : {
@@ -451,8 +472,7 @@ Object.defineProperties(URL.prototype, {
451
472
ctx . port = null ;
452
473
return ;
453
474
}
454
- binding . parse ( port , binding . kPort , null , ctx ,
455
- onParsePortComplete . bind ( this ) ) ;
475
+ _parse ( port , kPort , null , ctx , onParsePortComplete . bind ( this ) ) ;
456
476
}
457
477
} ,
458
478
pathname : {
@@ -471,8 +491,8 @@ Object.defineProperties(URL.prototype, {
471
491
path = `${ path } ` ;
472
492
if ( this [ cannotBeBase ] )
473
493
return ;
474
- binding . parse ( path , binding . kPathStart , null , this [ context ] ,
475
- onParsePathComplete . bind ( this ) ) ;
494
+ _parse ( path , kPathStart , null , this [ context ] ,
495
+ onParsePathComplete . bind ( this ) ) ;
476
496
}
477
497
} ,
478
498
search : {
@@ -489,14 +509,13 @@ Object.defineProperties(URL.prototype, {
489
509
search = toUSVString ( search ) ;
490
510
if ( search === '' ) {
491
511
ctx . query = null ;
492
- ctx . flags &= ~ binding . URL_FLAGS_HAS_QUERY ;
512
+ ctx . flags &= ~ URL_FLAGS_HAS_QUERY ;
493
513
} else {
494
514
if ( search [ 0 ] === '?' ) search = search . slice ( 1 ) ;
495
515
ctx . query = '' ;
496
- ctx . flags |= binding . URL_FLAGS_HAS_QUERY ;
516
+ ctx . flags |= URL_FLAGS_HAS_QUERY ;
497
517
if ( search ) {
498
- binding . parse ( search , binding . kQuery , null , ctx ,
499
- onParseSearchComplete . bind ( this ) ) ;
518
+ _parse ( search , kQuery , null , ctx , onParseSearchComplete . bind ( this ) ) ;
500
519
}
501
520
}
502
521
initSearchParams ( this [ searchParams ] , search ) ;
@@ -524,14 +543,13 @@ Object.defineProperties(URL.prototype, {
524
543
hash = `${ hash } ` ;
525
544
if ( ! hash ) {
526
545
ctx . fragment = null ;
527
- ctx . flags &= ~ binding . URL_FLAGS_HAS_FRAGMENT ;
546
+ ctx . flags &= ~ URL_FLAGS_HAS_FRAGMENT ;
528
547
return ;
529
548
}
530
549
if ( hash [ 0 ] === '#' ) hash = hash . slice ( 1 ) ;
531
550
ctx . fragment = '' ;
532
- ctx . flags |= binding . URL_FLAGS_HAS_FRAGMENT ;
533
- binding . parse ( hash , binding . kFragment , null , ctx ,
534
- onParseHashComplete . bind ( this ) ) ;
551
+ ctx . flags |= URL_FLAGS_HAS_FRAGMENT ;
552
+ _parse ( hash , kFragment , null , ctx , onParseHashComplete . bind ( this ) ) ;
535
553
}
536
554
} ,
537
555
toJSON : {
@@ -553,10 +571,10 @@ function update(url, params) {
553
571
const serializedParams = params . toString ( ) ;
554
572
if ( serializedParams ) {
555
573
ctx . query = serializedParams ;
556
- ctx . flags |= binding . URL_FLAGS_HAS_QUERY ;
574
+ ctx . flags |= URL_FLAGS_HAS_QUERY ;
557
575
} else {
558
576
ctx . query = null ;
559
- ctx . flags &= ~ binding . URL_FLAGS_HAS_QUERY ;
577
+ ctx . flags &= ~ URL_FLAGS_HAS_QUERY ;
560
578
}
561
579
}
562
580
@@ -1257,15 +1275,15 @@ function domainToASCII(domain) {
1257
1275
throw new errors . TypeError ( 'ERR_MISSING_ARGS' , 'domain' ) ;
1258
1276
1259
1277
// toUSVString is not needed.
1260
- return binding . domainToASCII ( `${ domain } ` ) ;
1278
+ return _domainToASCII ( `${ domain } ` ) ;
1261
1279
}
1262
1280
1263
1281
function domainToUnicode ( domain ) {
1264
1282
if ( arguments . length < 1 )
1265
1283
throw new errors . TypeError ( 'ERR_MISSING_ARGS' , 'domain' ) ;
1266
1284
1267
1285
// toUSVString is not needed.
1268
- return binding . domainToUnicode ( `${ domain } ` ) ;
1286
+ return _domainToUnicode ( `${ domain } ` ) ;
1269
1287
}
1270
1288
1271
1289
// Utility function that converts a URL object into an ordinary
@@ -1365,10 +1383,10 @@ function constructUrl(flags, protocol, username, password,
1365
1383
var ctx = new URLContext ( ) ;
1366
1384
ctx . flags = flags ;
1367
1385
ctx . scheme = protocol ;
1368
- ctx . username = ( flags & binding . URL_FLAGS_HAS_USERNAME ) !== 0 ? username : '' ;
1369
- ctx . password = ( flags & binding . URL_FLAGS_HAS_PASSWORD ) !== 0 ? password : '' ;
1386
+ ctx . username = ( flags & URL_FLAGS_HAS_USERNAME ) !== 0 ? username : '' ;
1387
+ ctx . password = ( flags & URL_FLAGS_HAS_PASSWORD ) !== 0 ? password : '' ;
1370
1388
ctx . port = port ;
1371
- ctx . path = ( flags & binding . URL_FLAGS_HAS_PATH ) !== 0 ? path : [ ] ;
1389
+ ctx . path = ( flags & URL_FLAGS_HAS_PATH ) !== 0 ? path : [ ] ;
1372
1390
ctx . query = query ;
1373
1391
ctx . fragment = fragment ;
1374
1392
ctx . host = host ;
@@ -1378,7 +1396,7 @@ function constructUrl(flags, protocol, username, password,
1378
1396
initSearchParams ( url [ searchParams ] , query ) ;
1379
1397
return url ;
1380
1398
}
1381
- binding . setURLConstructor ( constructUrl ) ;
1399
+ setURLConstructor ( constructUrl ) ;
1382
1400
1383
1401
module . exports = {
1384
1402
toUSVString,
0 commit comments