Skip to content

Commit 2f74326

Browse files
dayninBridgeAR
authored andcommitted
url: replace "magic" numbers by constants
PR-URL: #19035 Reviewed-By: Myles Borins <myles.borins@gmail.com> Reviewed-By: Daijiro Wachi <daijiro.wachi@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Daniel Bevenius <daniel.bevenius@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Khaidi Chu <i@2333.moe> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Tobias Nießen <tniessen@tnie.de> Reviewed-By: Anatoli Papirovski <apapirovski@mac.com>
1 parent 0e35683 commit 2f74326

File tree

2 files changed

+109
-49
lines changed

2 files changed

+109
-49
lines changed

lib/internal/constants.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,34 @@ module.exports = {
1111
CHAR_DOT: 46, /* . */
1212
CHAR_FORWARD_SLASH: 47, /* / */
1313
CHAR_BACKWARD_SLASH: 92, /* \ */
14+
CHAR_VERTICAL_LINE: 124, /* | */
1415
CHAR_COLON: 58, /* : */
1516
CHAR_QUESTION_MARK: 63, /* ? */
1617
CHAR_UNDERSCORE: 95, /* _ */
1718
CHAR_LINE_FEED: 10, /* \n */
1819
CHAR_CARRIAGE_RETURN: 13, /* \r */
20+
CHAR_TAB: 9, /* \t */
21+
CHAR_FORM_FEED: 12, /* \f */
1922
CHAR_EXCLAMATION_MARK: 33, /* ! */
2023
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, /* @ */
2142

2243
// Digits
2344
CHAR_0: 48, /* 0 */

lib/url.js

Lines changed: 88 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,43 @@ const slashedProtocol = {
9494
'file:': true
9595
};
9696
const querystring = require('querystring');
97+
const {
98+
CHAR_SPACE,
99+
CHAR_TAB,
100+
CHAR_CARRIAGE_RETURN,
101+
CHAR_LINE_FEED,
102+
CHAR_FORM_FEED,
103+
CHAR_NO_BREAK_SPACE,
104+
CHAR_ZERO_WIDTH_NOBREAK_SPACE,
105+
CHAR_HASH,
106+
CHAR_FORWARD_SLASH,
107+
CHAR_LEFT_SQUARE_BRACKET,
108+
CHAR_RIGHT_SQUARE_BRACKET,
109+
CHAR_LEFT_ANGLE_BRACKET,
110+
CHAR_RIGHT_ANGLE_BRACKET,
111+
CHAR_LEFT_CURLY_BRACKET,
112+
CHAR_RIGHT_CURLY_BRACKET,
113+
CHAR_QUESTION_MARK,
114+
CHAR_LOWERCASE_A,
115+
CHAR_LOWERCASE_Z,
116+
CHAR_UPPERCASE_A,
117+
CHAR_UPPERCASE_Z,
118+
CHAR_DOT,
119+
CHAR_0,
120+
CHAR_9,
121+
CHAR_HYPHEN_MINUS,
122+
CHAR_PLUS,
123+
CHAR_UNDERSCORE,
124+
CHAR_DOUBLE_QUOTE,
125+
CHAR_SINGLE_QUOTE,
126+
CHAR_PERCENT,
127+
CHAR_SEMICOLON,
128+
CHAR_BACKWARD_SLASH,
129+
CHAR_CIRCUMFLEX_ACCENT,
130+
CHAR_GRAVE_ACCENT,
131+
CHAR_VERTICAL_LINE,
132+
CHAR_AT,
133+
} = require('internal/constants');
97134

98135
function urlParse(url, parseQueryString, slashesDenoteHost) {
99136
if (url instanceof Url) return url;
@@ -121,13 +158,13 @@ Url.prototype.parse = function parse(url, parseQueryString, slashesDenoteHost) {
121158
const code = url.charCodeAt(i);
122159

123160
// Find first and last non-whitespace characters for trimming
124-
const isWs = code === 32/* */ ||
125-
code === 9/*\t*/ ||
126-
code === 13/*\r*/ ||
127-
code === 10/*\n*/ ||
128-
code === 12/*\f*/ ||
129-
code === 160/*\u00A0*/ ||
130-
code === 65279/*\uFEFF*/;
161+
const isWs = code === CHAR_SPACE ||
162+
code === CHAR_TAB ||
163+
code === CHAR_CARRIAGE_RETURN ||
164+
code === CHAR_LINE_FEED ||
165+
code === CHAR_FORM_FEED ||
166+
code === CHAR_NO_BREAK_SPACE ||
167+
code === CHAR_ZERO_WIDTH_NOBREAK_SPACE;
131168
if (start === -1) {
132169
if (isWs)
133170
continue;
@@ -145,20 +182,20 @@ Url.prototype.parse = function parse(url, parseQueryString, slashesDenoteHost) {
145182
// Only convert backslashes while we haven't seen a split character
146183
if (!split) {
147184
switch (code) {
148-
case 35: // '#'
185+
case CHAR_HASH:
149186
hasHash = true;
150187
// Fall through
151-
case 63: // '?'
188+
case CHAR_QUESTION_MARK:
152189
split = true;
153190
break;
154-
case 92: // '\\'
191+
case CHAR_BACKWARD_SLASH:
155192
if (i - lastPos > 0)
156193
rest += url.slice(lastPos, i);
157194
rest += '/';
158195
lastPos = i + 1;
159196
break;
160197
}
161-
} else if (!hasHash && code === 35/*#*/) {
198+
} else if (!hasHash && code === CHAR_HASH) {
162199
hasHash = true;
163200
}
164201
}
@@ -220,8 +257,8 @@ Url.prototype.parse = function parse(url, parseQueryString, slashesDenoteHost) {
220257
// resolution will treat //foo/bar as host=foo,path=bar because that's
221258
// how the browser resolves relative URLs.
222259
if (slashesDenoteHost || proto || hostPattern.test(rest)) {
223-
var slashes = rest.charCodeAt(0) === 47/*/*/ &&
224-
rest.charCodeAt(1) === 47/*/*/;
260+
var slashes = rest.charCodeAt(0) === CHAR_FORWARD_SLASH &&
261+
rest.charCodeAt(1) === CHAR_FORWARD_SLASH;
225262
if (slashes && !(proto && hostlessProtocol[proto])) {
226263
rest = rest.slice(2);
227264
this.slashes = true;
@@ -251,35 +288,35 @@ Url.prototype.parse = function parse(url, parseQueryString, slashesDenoteHost) {
251288
var nonHost = -1;
252289
for (i = 0; i < rest.length; ++i) {
253290
switch (rest.charCodeAt(i)) {
254-
case 9: // '\t'
255-
case 10: // '\n'
256-
case 13: // '\r'
257-
case 32: // ' '
258-
case 34: // '"'
259-
case 37: // '%'
260-
case 39: // '\''
261-
case 59: // ';'
262-
case 60: // '<'
263-
case 62: // '>'
264-
case 92: // '\\'
265-
case 94: // '^'
266-
case 96: // '`'
267-
case 123: // '{'
268-
case 124: // '|'
269-
case 125: // '}'
291+
case CHAR_TAB:
292+
case CHAR_LINE_FEED:
293+
case CHAR_CARRIAGE_RETURN:
294+
case CHAR_SPACE:
295+
case CHAR_DOUBLE_QUOTE:
296+
case CHAR_PERCENT:
297+
case CHAR_SINGLE_QUOTE:
298+
case CHAR_SEMICOLON:
299+
case CHAR_LEFT_ANGLE_BRACKET:
300+
case CHAR_RIGHT_ANGLE_BRACKET:
301+
case CHAR_BACKWARD_SLASH:
302+
case CHAR_CIRCUMFLEX_ACCENT:
303+
case CHAR_GRAVE_ACCENT:
304+
case CHAR_LEFT_CURLY_BRACKET:
305+
case CHAR_VERTICAL_LINE:
306+
case CHAR_RIGHT_CURLY_BRACKET:
270307
// Characters that are never ever allowed in a hostname from RFC 2396
271308
if (nonHost === -1)
272309
nonHost = i;
273310
break;
274-
case 35: // '#'
275-
case 47: // '/'
276-
case 63: // '?'
311+
case CHAR_HASH:
312+
case CHAR_FORWARD_SLASH:
313+
case CHAR_QUESTION_MARK:
277314
// Find the first instance of any host-ending characters
278315
if (nonHost === -1)
279316
nonHost = i;
280317
hostEnd = i;
281318
break;
282-
case 64: // '@'
319+
case CHAR_AT:
283320
// At this point, either we have an explicit point where the
284321
// auth portion cannot go past, or the last @ char is the decider.
285322
atSign = i;
@@ -314,8 +351,8 @@ Url.prototype.parse = function parse(url, parseQueryString, slashesDenoteHost) {
314351

315352
// if hostname begins with [ and ends with ]
316353
// assume that it's an IPv6 address.
317-
var ipv6Hostname = hostname.charCodeAt(0) === 91/*[*/ &&
318-
hostname.charCodeAt(hostname.length - 1) === 93/*]*/;
354+
var ipv6Hostname = hostname.charCodeAt(0) === CHAR_LEFT_SQUARE_BRACKET &&
355+
hostname.charCodeAt(hostname.length - 1) === CHAR_RIGHT_SQUARE_BRACKET;
319356

320357
// validate a little.
321358
if (!ipv6Hostname) {
@@ -369,11 +406,11 @@ Url.prototype.parse = function parse(url, parseQueryString, slashesDenoteHost) {
369406
var hashIdx = -1;
370407
for (i = 0; i < rest.length; ++i) {
371408
const code = rest.charCodeAt(i);
372-
if (code === 35/*#*/) {
409+
if (code === CHAR_HASH) {
373410
this.hash = rest.slice(i);
374411
hashIdx = i;
375412
break;
376-
} else if (code === 63/*?*/ && questionIdx === -1) {
413+
} else if (code === CHAR_QUESTION_MARK && questionIdx === -1) {
377414
questionIdx = i;
378415
}
379416
}
@@ -424,13 +461,13 @@ Url.prototype.parse = function parse(url, parseQueryString, slashesDenoteHost) {
424461
function validateHostname(self, rest, hostname) {
425462
for (var i = 0; i < hostname.length; ++i) {
426463
const code = hostname.charCodeAt(i);
427-
const isValid = (code >= 97/*a*/ && code <= 122/*z*/) ||
428-
code === 46/*.*/ ||
429-
(code >= 65/*A*/ && code <= 90/*Z*/) ||
430-
(code >= 48/*0*/ && code <= 57/*9*/) ||
431-
code === 45/*-*/ ||
432-
code === 43/*+*/ ||
433-
code === 95/*_*/ ||
464+
const isValid = (code >= CHAR_LOWERCASE_A && code <= CHAR_LOWERCASE_Z) ||
465+
code === CHAR_DOT ||
466+
(code >= CHAR_UPPERCASE_A && code <= CHAR_UPPERCASE_Z) ||
467+
(code >= CHAR_0 && code <= CHAR_9) ||
468+
code === CHAR_HYPHEN_MINUS ||
469+
code === CHAR_PLUS ||
470+
code === CHAR_UNDERSCORE ||
434471
code > 127;
435472

436473
// Invalid host character
@@ -544,13 +581,13 @@ Url.prototype.format = function format() {
544581
var lastPos = 0;
545582
for (var i = 0; i < pathname.length; ++i) {
546583
switch (pathname.charCodeAt(i)) {
547-
case 35: // '#'
584+
case CHAR_HASH:
548585
if (i - lastPos > 0)
549586
newPathname += pathname.slice(lastPos, i);
550587
newPathname += '%23';
551588
lastPos = i + 1;
552589
break;
553-
case 63: // '?'
590+
case CHAR_QUESTION_MARK:
554591
if (i - lastPos > 0)
555592
newPathname += pathname.slice(lastPos, i);
556593
newPathname += '%3F';
@@ -569,7 +606,7 @@ Url.prototype.format = function format() {
569606
// unless they had them to begin with.
570607
if (this.slashes || slashedProtocol[protocol]) {
571608
if (this.slashes || host) {
572-
if (pathname && pathname.charCodeAt(0) !== 47/*/*/)
609+
if (pathname && pathname.charCodeAt(0) !== CHAR_FORWARD_SLASH)
573610
pathname = '/' + pathname;
574611
host = '//' + host;
575612
} else if (protocol.length >= 4 &&
@@ -583,8 +620,10 @@ Url.prototype.format = function format() {
583620

584621
search = search.replace(/#/g, '%23');
585622

586-
if (hash && hash.charCodeAt(0) !== 35/*#*/) hash = '#' + hash;
587-
if (search && search.charCodeAt(0) !== 63/*?*/) search = '?' + search;
623+
if (hash && hash.charCodeAt(0) !== CHAR_HASH)
624+
hash = '#' + hash;
625+
if (search && search.charCodeAt(0) !== CHAR_QUESTION_MARK)
626+
search = '?' + search;
588627

589628
return protocol + host + pathname + search + hash;
590629
};

0 commit comments

Comments
 (0)