@@ -92,6 +92,43 @@ const slashedProtocol = {
92
92
'file:' : true
93
93
} ;
94
94
const querystring = require ( 'querystring' ) ;
95
+ const {
96
+ CHAR_SPACE ,
97
+ CHAR_TAB ,
98
+ CHAR_CARRIAGE_RETURN ,
99
+ CHAR_LINE_FEED ,
100
+ CHAR_FORM_FEED ,
101
+ CHAR_NO_BREAK_SPACE ,
102
+ CHAR_ZERO_WIDTH_NOBREAK_SPACE ,
103
+ CHAR_HASH ,
104
+ CHAR_FORWARD_SLASH ,
105
+ CHAR_LEFT_SQUARE_BRACKET ,
106
+ CHAR_RIGHT_SQUARE_BRACKET ,
107
+ CHAR_LEFT_ANGLE_BRACKET ,
108
+ CHAR_RIGHT_ANGLE_BRACKET ,
109
+ CHAR_LEFT_CURLY_BRACKET ,
110
+ CHAR_RIGHT_CURLY_BRACKET ,
111
+ CHAR_QUESTION_MARK ,
112
+ CHAR_LOWERCASE_A ,
113
+ CHAR_LOWERCASE_Z ,
114
+ CHAR_UPPERCASE_A ,
115
+ CHAR_UPPERCASE_Z ,
116
+ CHAR_DOT ,
117
+ CHAR_0 ,
118
+ CHAR_9 ,
119
+ CHAR_HYPHEN_MINUS ,
120
+ CHAR_PLUS ,
121
+ CHAR_UNDERSCORE ,
122
+ CHAR_DOUBLE_QUOTE ,
123
+ CHAR_SINGLE_QUOTE ,
124
+ CHAR_PERCENT ,
125
+ CHAR_SEMICOLON ,
126
+ CHAR_BACKWARD_SLASH ,
127
+ CHAR_CIRCUMFLEX_ACCENT ,
128
+ CHAR_GRAVE_ACCENT ,
129
+ CHAR_VERTICAL_LINE ,
130
+ CHAR_AT ,
131
+ } = require ( 'internal/constants' ) ;
95
132
96
133
function urlParse ( url , parseQueryString , slashesDenoteHost ) {
97
134
if ( url instanceof Url ) return url ;
@@ -119,13 +156,13 @@ Url.prototype.parse = function parse(url, parseQueryString, slashesDenoteHost) {
119
156
const code = url . charCodeAt ( i ) ;
120
157
121
158
// Find first and last non-whitespace characters for trimming
122
- const isWs = code === 32 /* */ ||
123
- code === 9 /*\t*/ ||
124
- code === 13 /*\r*/ ||
125
- code === 10 /*\n*/ ||
126
- code === 12 /*\f*/ ||
127
- code === 160 /*\u00A0*/ ||
128
- code === 65279 /*\uFEFF*/ ;
159
+ const isWs = code === CHAR_SPACE ||
160
+ code === CHAR_TAB ||
161
+ code === CHAR_CARRIAGE_RETURN ||
162
+ code === CHAR_LINE_FEED ||
163
+ code === CHAR_FORM_FEED ||
164
+ code === CHAR_NO_BREAK_SPACE ||
165
+ code === CHAR_ZERO_WIDTH_NOBREAK_SPACE ;
129
166
if ( start === - 1 ) {
130
167
if ( isWs )
131
168
continue ;
@@ -143,20 +180,20 @@ Url.prototype.parse = function parse(url, parseQueryString, slashesDenoteHost) {
143
180
// Only convert backslashes while we haven't seen a split character
144
181
if ( ! split ) {
145
182
switch ( code ) {
146
- case 35 : // '#'
183
+ case CHAR_HASH :
147
184
hasHash = true ;
148
185
// Fall through
149
- case 63 : // '?'
186
+ case CHAR_QUESTION_MARK :
150
187
split = true ;
151
188
break ;
152
- case 92 : // '\\'
189
+ case CHAR_BACKWARD_SLASH :
153
190
if ( i - lastPos > 0 )
154
191
rest += url . slice ( lastPos , i ) ;
155
192
rest += '/' ;
156
193
lastPos = i + 1 ;
157
194
break ;
158
195
}
159
- } else if ( ! hasHash && code === 35 /*#*/ ) {
196
+ } else if ( ! hasHash && code === CHAR_HASH ) {
160
197
hasHash = true ;
161
198
}
162
199
}
@@ -218,8 +255,8 @@ Url.prototype.parse = function parse(url, parseQueryString, slashesDenoteHost) {
218
255
// resolution will treat //foo/bar as host=foo,path=bar because that's
219
256
// how the browser resolves relative URLs.
220
257
if ( slashesDenoteHost || proto || hostPattern . test ( rest ) ) {
221
- var slashes = rest . charCodeAt ( 0 ) === 47 /*/*/ &&
222
- rest . charCodeAt ( 1 ) === 47 /*/*/ ;
258
+ var slashes = rest . charCodeAt ( 0 ) === CHAR_FORWARD_SLASH &&
259
+ rest . charCodeAt ( 1 ) === CHAR_FORWARD_SLASH ;
223
260
if ( slashes && ! ( proto && hostlessProtocol [ proto ] ) ) {
224
261
rest = rest . slice ( 2 ) ;
225
262
this . slashes = true ;
@@ -249,35 +286,35 @@ Url.prototype.parse = function parse(url, parseQueryString, slashesDenoteHost) {
249
286
var nonHost = - 1 ;
250
287
for ( i = 0 ; i < rest . length ; ++ i ) {
251
288
switch ( rest . charCodeAt ( i ) ) {
252
- case 9 : // '\t'
253
- case 10 : // '\n'
254
- case 13 : // '\r'
255
- case 32 : // ' '
256
- case 34 : // '"'
257
- case 37 : // '%'
258
- case 39 : // '\''
259
- case 59 : // ';'
260
- case 60 : // '<'
261
- case 62 : // '>'
262
- case 92 : // '\\'
263
- case 94 : // '^'
264
- case 96 : // '`'
265
- case 123 : // '{'
266
- case 124 : // '|'
267
- case 125 : // '}'
289
+ case CHAR_TAB :
290
+ case CHAR_LINE_FEED :
291
+ case CHAR_CARRIAGE_RETURN :
292
+ case CHAR_SPACE :
293
+ case CHAR_DOUBLE_QUOTE :
294
+ case CHAR_PERCENT :
295
+ case CHAR_SINGLE_QUOTE :
296
+ case CHAR_SEMICOLON :
297
+ case CHAR_LEFT_ANGLE_BRACKET :
298
+ case CHAR_RIGHT_ANGLE_BRACKET :
299
+ case CHAR_BACKWARD_SLASH :
300
+ case CHAR_CIRCUMFLEX_ACCENT :
301
+ case CHAR_GRAVE_ACCENT :
302
+ case CHAR_LEFT_CURLY_BRACKET :
303
+ case CHAR_VERTICAL_LINE :
304
+ case CHAR_RIGHT_CURLY_BRACKET :
268
305
// Characters that are never ever allowed in a hostname from RFC 2396
269
306
if ( nonHost === - 1 )
270
307
nonHost = i ;
271
308
break ;
272
- case 35 : // '#'
273
- case 47 : // '/'
274
- case 63 : // '?'
309
+ case CHAR_HASH :
310
+ case CHAR_FORWARD_SLASH :
311
+ case CHAR_QUESTION_MARK :
275
312
// Find the first instance of any host-ending characters
276
313
if ( nonHost === - 1 )
277
314
nonHost = i ;
278
315
hostEnd = i ;
279
316
break ;
280
- case 64 : // '@'
317
+ case CHAR_AT :
281
318
// At this point, either we have an explicit point where the
282
319
// auth portion cannot go past, or the last @ char is the decider.
283
320
atSign = i ;
@@ -312,8 +349,8 @@ Url.prototype.parse = function parse(url, parseQueryString, slashesDenoteHost) {
312
349
313
350
// if hostname begins with [ and ends with ]
314
351
// assume that it's an IPv6 address.
315
- var ipv6Hostname = hostname . charCodeAt ( 0 ) === 91 /*[*/ &&
316
- hostname . charCodeAt ( hostname . length - 1 ) === 93 /*]*/ ;
352
+ var ipv6Hostname = hostname . charCodeAt ( 0 ) === CHAR_LEFT_SQUARE_BRACKET &&
353
+ hostname . charCodeAt ( hostname . length - 1 ) === CHAR_RIGHT_SQUARE_BRACKET ;
317
354
318
355
// validate a little.
319
356
if ( ! ipv6Hostname ) {
@@ -367,11 +404,11 @@ Url.prototype.parse = function parse(url, parseQueryString, slashesDenoteHost) {
367
404
var hashIdx = - 1 ;
368
405
for ( i = 0 ; i < rest . length ; ++ i ) {
369
406
const code = rest . charCodeAt ( i ) ;
370
- if ( code === 35 /*#*/ ) {
407
+ if ( code === CHAR_HASH ) {
371
408
this . hash = rest . slice ( i ) ;
372
409
hashIdx = i ;
373
410
break ;
374
- } else if ( code === 63 /*?*/ && questionIdx === - 1 ) {
411
+ } else if ( code === CHAR_QUESTION_MARK && questionIdx === - 1 ) {
375
412
questionIdx = i ;
376
413
}
377
414
}
@@ -422,13 +459,13 @@ Url.prototype.parse = function parse(url, parseQueryString, slashesDenoteHost) {
422
459
function validateHostname ( self , rest , hostname ) {
423
460
for ( var i = 0 ; i < hostname . length ; ++ i ) {
424
461
const code = hostname . charCodeAt ( i ) ;
425
- const isValid = ( code >= 97 /*a*/ && code <= 122 /*z*/ ) ||
426
- code === 46 /*.*/ ||
427
- ( code >= 65 /*A*/ && code <= 90 /*Z*/ ) ||
428
- ( code >= 48 /*0*/ && code <= 57 /*9*/ ) ||
429
- code === 45 /*-*/ ||
430
- code === 43 /*+*/ ||
431
- code === 95 /*_*/ ||
462
+ const isValid = ( code >= CHAR_LOWERCASE_A && code <= CHAR_LOWERCASE_Z ) ||
463
+ code === CHAR_DOT ||
464
+ ( code >= CHAR_UPPERCASE_A && code <= CHAR_UPPERCASE_Z ) ||
465
+ ( code >= CHAR_0 && code <= CHAR_9 ) ||
466
+ code === CHAR_HYPHEN_MINUS ||
467
+ code === CHAR_PLUS ||
468
+ code === CHAR_UNDERSCORE ||
432
469
code > 127 ;
433
470
434
471
// Invalid host character
@@ -542,13 +579,13 @@ Url.prototype.format = function format() {
542
579
var lastPos = 0 ;
543
580
for ( var i = 0 ; i < pathname . length ; ++ i ) {
544
581
switch ( pathname . charCodeAt ( i ) ) {
545
- case 35 : // '#'
582
+ case CHAR_HASH :
546
583
if ( i - lastPos > 0 )
547
584
newPathname += pathname . slice ( lastPos , i ) ;
548
585
newPathname += '%23' ;
549
586
lastPos = i + 1 ;
550
587
break ;
551
- case 63 : // '?'
588
+ case CHAR_QUESTION_MARK :
552
589
if ( i - lastPos > 0 )
553
590
newPathname += pathname . slice ( lastPos , i ) ;
554
591
newPathname += '%3F' ;
@@ -567,7 +604,7 @@ Url.prototype.format = function format() {
567
604
// unless they had them to begin with.
568
605
if ( this . slashes || slashedProtocol [ protocol ] ) {
569
606
if ( this . slashes || host ) {
570
- if ( pathname && pathname . charCodeAt ( 0 ) !== 47 /*/*/ )
607
+ if ( pathname && pathname . charCodeAt ( 0 ) !== CHAR_FORWARD_SLASH )
571
608
pathname = '/' + pathname ;
572
609
host = '//' + host ;
573
610
} else if ( protocol . length >= 4 &&
@@ -581,8 +618,10 @@ Url.prototype.format = function format() {
581
618
582
619
search = search . replace ( / # / g, '%23' ) ;
583
620
584
- if ( hash && hash . charCodeAt ( 0 ) !== 35 /*#*/ ) hash = '#' + hash ;
585
- if ( search && search . charCodeAt ( 0 ) !== 63 /*?*/ ) search = '?' + search ;
621
+ if ( hash && hash . charCodeAt ( 0 ) !== CHAR_HASH )
622
+ hash = '#' + hash ;
623
+ if ( search && search . charCodeAt ( 0 ) !== CHAR_QUESTION_MARK )
624
+ search = '?' + search ;
586
625
587
626
return protocol + host + pathname + search + hash ;
588
627
} ;
0 commit comments