Skip to content

Commit 072adfe

Browse files
dayninMylesBorins
authored andcommitted
url: replace "magic" numbers by constants
PR-URL: #19035 Reviewed-By: Myles Borins <[email protected]> Reviewed-By: Daijiro Wachi <[email protected]> Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: Daniel Bevenius <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Khaidi Chu <[email protected]> Reviewed-By: Benjamin Gruenbaum <[email protected]> Reviewed-By: Tobias Nießen <[email protected]> Reviewed-By: Anatoli Papirovski <[email protected]>
1 parent 528798c commit 072adfe

File tree

2 files changed

+123
-54
lines changed

2 files changed

+123
-54
lines changed

lib/internal/constants.js

+35-5
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,39 @@ module.exports = {
88
CHAR_LOWERCASE_Z: 122, /*z*/
99

1010
// Non-alphabetic chars.
11-
CHAR_DOT: 46, /*.*/
12-
CHAR_FORWARD_SLASH: 47, /*/*/
13-
CHAR_BACKWARD_SLASH: 92, /*\*/
14-
CHAR_COLON: 58, /*:*/
15-
CHAR_QUESTION_MARK: 63, /*?*/
11+
CHAR_DOT: 46, /* . */
12+
CHAR_FORWARD_SLASH: 47, /* / */
13+
CHAR_BACKWARD_SLASH: 92, /* \ */
14+
CHAR_VERTICAL_LINE: 124, /* | */
15+
CHAR_COLON: 58, /* : */
16+
CHAR_QUESTION_MARK: 63, /* ? */
17+
CHAR_UNDERSCORE: 95, /* _ */
18+
CHAR_LINE_FEED: 10, /* \n */
19+
CHAR_CARRIAGE_RETURN: 13, /* \r */
20+
CHAR_TAB: 9, /* \t */
21+
CHAR_FORM_FEED: 12, /* \f */
22+
CHAR_EXCLAMATION_MARK: 33, /* ! */
23+
CHAR_HASH: 35, /* # */
24+
CHAR_SPACE: 32, /* */
25+
CHAR_NO_BREAK_SPACE: 160, /* \u00A0 */
26+
CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279, /* \uFEFF */
27+
CHAR_LEFT_SQUARE_BRACKET: 91, /* [ */
28+
CHAR_RIGHT_SQUARE_BRACKET: 93, /* ] */
29+
CHAR_LEFT_ANGLE_BRACKET: 60, /* < */
30+
CHAR_RIGHT_ANGLE_BRACKET: 62, /* > */
31+
CHAR_LEFT_CURLY_BRACKET: 123, /* { */
32+
CHAR_RIGHT_CURLY_BRACKET: 125, /* } */
33+
CHAR_HYPHEN_MINUS: 45, /* - */
34+
CHAR_PLUS: 43, /* + */
35+
CHAR_DOUBLE_QUOTE: 34, /* " */
36+
CHAR_SINGLE_QUOTE: 39, /* ' */
37+
CHAR_PERCENT: 37, /* % */
38+
CHAR_SEMICOLON: 59, /* ; */
39+
CHAR_CIRCUMFLEX_ACCENT: 94, /* ^ */
40+
CHAR_GRAVE_ACCENT: 96, /* ` */
41+
CHAR_AT: 64, /* @ */
42+
43+
// Digits
44+
CHAR_0: 48, /* 0 */
45+
CHAR_9: 57, /* 9 */
1646
};

lib/url.js

+88-49
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,43 @@ const slashedProtocol = {
9292
'file:': true
9393
};
9494
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');
95132

96133
function urlParse(url, parseQueryString, slashesDenoteHost) {
97134
if (url instanceof Url) return url;
@@ -119,13 +156,13 @@ Url.prototype.parse = function parse(url, parseQueryString, slashesDenoteHost) {
119156
const code = url.charCodeAt(i);
120157

121158
// 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;
129166
if (start === -1) {
130167
if (isWs)
131168
continue;
@@ -143,20 +180,20 @@ Url.prototype.parse = function parse(url, parseQueryString, slashesDenoteHost) {
143180
// Only convert backslashes while we haven't seen a split character
144181
if (!split) {
145182
switch (code) {
146-
case 35: // '#'
183+
case CHAR_HASH:
147184
hasHash = true;
148185
// Fall through
149-
case 63: // '?'
186+
case CHAR_QUESTION_MARK:
150187
split = true;
151188
break;
152-
case 92: // '\\'
189+
case CHAR_BACKWARD_SLASH:
153190
if (i - lastPos > 0)
154191
rest += url.slice(lastPos, i);
155192
rest += '/';
156193
lastPos = i + 1;
157194
break;
158195
}
159-
} else if (!hasHash && code === 35/*#*/) {
196+
} else if (!hasHash && code === CHAR_HASH) {
160197
hasHash = true;
161198
}
162199
}
@@ -218,8 +255,8 @@ Url.prototype.parse = function parse(url, parseQueryString, slashesDenoteHost) {
218255
// resolution will treat //foo/bar as host=foo,path=bar because that's
219256
// how the browser resolves relative URLs.
220257
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;
223260
if (slashes && !(proto && hostlessProtocol[proto])) {
224261
rest = rest.slice(2);
225262
this.slashes = true;
@@ -249,35 +286,35 @@ Url.prototype.parse = function parse(url, parseQueryString, slashesDenoteHost) {
249286
var nonHost = -1;
250287
for (i = 0; i < rest.length; ++i) {
251288
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:
268305
// Characters that are never ever allowed in a hostname from RFC 2396
269306
if (nonHost === -1)
270307
nonHost = i;
271308
break;
272-
case 35: // '#'
273-
case 47: // '/'
274-
case 63: // '?'
309+
case CHAR_HASH:
310+
case CHAR_FORWARD_SLASH:
311+
case CHAR_QUESTION_MARK:
275312
// Find the first instance of any host-ending characters
276313
if (nonHost === -1)
277314
nonHost = i;
278315
hostEnd = i;
279316
break;
280-
case 64: // '@'
317+
case CHAR_AT:
281318
// At this point, either we have an explicit point where the
282319
// auth portion cannot go past, or the last @ char is the decider.
283320
atSign = i;
@@ -312,8 +349,8 @@ Url.prototype.parse = function parse(url, parseQueryString, slashesDenoteHost) {
312349

313350
// if hostname begins with [ and ends with ]
314351
// 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;
317354

318355
// validate a little.
319356
if (!ipv6Hostname) {
@@ -367,11 +404,11 @@ Url.prototype.parse = function parse(url, parseQueryString, slashesDenoteHost) {
367404
var hashIdx = -1;
368405
for (i = 0; i < rest.length; ++i) {
369406
const code = rest.charCodeAt(i);
370-
if (code === 35/*#*/) {
407+
if (code === CHAR_HASH) {
371408
this.hash = rest.slice(i);
372409
hashIdx = i;
373410
break;
374-
} else if (code === 63/*?*/ && questionIdx === -1) {
411+
} else if (code === CHAR_QUESTION_MARK && questionIdx === -1) {
375412
questionIdx = i;
376413
}
377414
}
@@ -422,13 +459,13 @@ Url.prototype.parse = function parse(url, parseQueryString, slashesDenoteHost) {
422459
function validateHostname(self, rest, hostname) {
423460
for (var i = 0; i < hostname.length; ++i) {
424461
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 ||
432469
code > 127;
433470

434471
// Invalid host character
@@ -542,13 +579,13 @@ Url.prototype.format = function format() {
542579
var lastPos = 0;
543580
for (var i = 0; i < pathname.length; ++i) {
544581
switch (pathname.charCodeAt(i)) {
545-
case 35: // '#'
582+
case CHAR_HASH:
546583
if (i - lastPos > 0)
547584
newPathname += pathname.slice(lastPos, i);
548585
newPathname += '%23';
549586
lastPos = i + 1;
550587
break;
551-
case 63: // '?'
588+
case CHAR_QUESTION_MARK:
552589
if (i - lastPos > 0)
553590
newPathname += pathname.slice(lastPos, i);
554591
newPathname += '%3F';
@@ -567,7 +604,7 @@ Url.prototype.format = function format() {
567604
// unless they had them to begin with.
568605
if (this.slashes || slashedProtocol[protocol]) {
569606
if (this.slashes || host) {
570-
if (pathname && pathname.charCodeAt(0) !== 47/*/*/)
607+
if (pathname && pathname.charCodeAt(0) !== CHAR_FORWARD_SLASH)
571608
pathname = '/' + pathname;
572609
host = '//' + host;
573610
} else if (protocol.length >= 4 &&
@@ -581,8 +618,10 @@ Url.prototype.format = function format() {
581618

582619
search = search.replace(/#/g, '%23');
583620

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;
586625

587626
return protocol + host + pathname + search + hash;
588627
};

0 commit comments

Comments
 (0)