Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit def51ba

Browse filesBrowse files
starkwangaddaleax
authored andcommitted
url: reduce deplicated codes in autoEscapeStr
PR-URL: #18613 Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
1 parent 8532251 commit def51ba
Copy full SHA for def51ba

File tree

Expand file treeCollapse file tree

2 files changed

+47
-87
lines changed
Open diff view settings
Filter options
Expand file treeCollapse file tree

2 files changed

+47
-87
lines changed
Open diff view settings
Collapse file

‎benchmark/url/url-parse.js‎

Copy file name to clipboard
+22Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
'use strict';
2+
const common = require('../common.js');
3+
const url = require('url');
4+
5+
const inputs = {
6+
normal: 'http://foo.com/bar',
7+
escaped: 'https://foo.bar/{}^`/abcd'
8+
};
9+
10+
const bench = common.createBenchmark(main, {
11+
type: Object.keys(inputs),
12+
n: [1e7]
13+
});
14+
15+
function main({ type, n }) {
16+
const input = inputs[type] || '';
17+
18+
bench.start();
19+
for (var i = 0; i < n; i += 1)
20+
url.parse(input);
21+
bench.end(n);
22+
}
Collapse file

‎lib/url.js‎

Copy file name to clipboardExpand all lines: lib/url.js
+25-87Lines changed: 25 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -439,101 +439,39 @@ function validateHostname(self, rest, hostname) {
439439
}
440440
}
441441

442+
// Escaped characters. Use empty strings to fill up unused entries.
443+
// Using Array is faster than Object/Map
444+
const escapedCodes = [
445+
/*0 - 9*/ '', '', '', '', '', '', '', '', '', '%09',
446+
/*10 - 19*/ '%0A', '', '', '%0D', '', '', '', '', '', '',
447+
/*20 - 29*/ '', '', '', '', '', '', '', '', '', '',
448+
/*30 - 39*/ '', '', '%20', '', '%22', '', '', '', '', '%27',
449+
/*40 - 49*/ '', '', '', '', '', '', '', '', '', '',
450+
/*50 - 59*/ '', '', '', '', '', '', '', '', '', '',
451+
/*60 - 69*/ '%3C', '', '%3E', '', '', '', '', '', '', '',
452+
/*70 - 79*/ '', '', '', '', '', '', '', '', '', '',
453+
/*80 - 89*/ '', '', '', '', '', '', '', '', '', '',
454+
/*90 - 99*/ '', '', '%5C', '', '%5E', '', '%60', '', '', '',
455+
/*100 - 109*/ '', '', '', '', '', '', '', '', '', '',
456+
/*110 - 119*/ '', '', '', '', '', '', '', '', '', '',
457+
/*120 - 125*/ '', '', '', '%7B', '%7C', '%7D'
458+
];
459+
442460
// Automatically escape all delimiters and unwise characters from RFC 2396.
443461
// Also escape single quotes in case of an XSS attack.
444462
// Return the escaped string.
445463
function autoEscapeStr(rest) {
446464
var escaped = '';
447465
var lastEscapedPos = 0;
448466
for (var i = 0; i < rest.length; ++i) {
449-
// Manual switching is faster than using a Map/Object.
450467
// `escaped` contains substring up to the last escaped character.
451-
switch (rest.charCodeAt(i)) {
452-
case 9: // '\t'
453-
// Concat if there are ordinary characters in the middle.
454-
if (i > lastEscapedPos)
455-
escaped += rest.slice(lastEscapedPos, i);
456-
escaped += '%09';
457-
lastEscapedPos = i + 1;
458-
break;
459-
case 10: // '\n'
460-
if (i > lastEscapedPos)
461-
escaped += rest.slice(lastEscapedPos, i);
462-
escaped += '%0A';
463-
lastEscapedPos = i + 1;
464-
break;
465-
case 13: // '\r'
466-
if (i > lastEscapedPos)
467-
escaped += rest.slice(lastEscapedPos, i);
468-
escaped += '%0D';
469-
lastEscapedPos = i + 1;
470-
break;
471-
case 32: // ' '
472-
if (i > lastEscapedPos)
473-
escaped += rest.slice(lastEscapedPos, i);
474-
escaped += '%20';
475-
lastEscapedPos = i + 1;
476-
break;
477-
case 34: // '"'
478-
if (i > lastEscapedPos)
479-
escaped += rest.slice(lastEscapedPos, i);
480-
escaped += '%22';
481-
lastEscapedPos = i + 1;
482-
break;
483-
case 39: // '\''
484-
if (i > lastEscapedPos)
485-
escaped += rest.slice(lastEscapedPos, i);
486-
escaped += '%27';
487-
lastEscapedPos = i + 1;
488-
break;
489-
case 60: // '<'
490-
if (i > lastEscapedPos)
491-
escaped += rest.slice(lastEscapedPos, i);
492-
escaped += '%3C';
493-
lastEscapedPos = i + 1;
494-
break;
495-
case 62: // '>'
496-
if (i > lastEscapedPos)
497-
escaped += rest.slice(lastEscapedPos, i);
498-
escaped += '%3E';
499-
lastEscapedPos = i + 1;
500-
break;
501-
case 92: // '\\'
502-
if (i > lastEscapedPos)
503-
escaped += rest.slice(lastEscapedPos, i);
504-
escaped += '%5C';
505-
lastEscapedPos = i + 1;
506-
break;
507-
case 94: // '^'
508-
if (i > lastEscapedPos)
509-
escaped += rest.slice(lastEscapedPos, i);
510-
escaped += '%5E';
511-
lastEscapedPos = i + 1;
512-
break;
513-
case 96: // '`'
514-
if (i > lastEscapedPos)
515-
escaped += rest.slice(lastEscapedPos, i);
516-
escaped += '%60';
517-
lastEscapedPos = i + 1;
518-
break;
519-
case 123: // '{'
520-
if (i > lastEscapedPos)
521-
escaped += rest.slice(lastEscapedPos, i);
522-
escaped += '%7B';
523-
lastEscapedPos = i + 1;
524-
break;
525-
case 124: // '|'
526-
if (i > lastEscapedPos)
527-
escaped += rest.slice(lastEscapedPos, i);
528-
escaped += '%7C';
529-
lastEscapedPos = i + 1;
530-
break;
531-
case 125: // '}'
532-
if (i > lastEscapedPos)
533-
escaped += rest.slice(lastEscapedPos, i);
534-
escaped += '%7D';
535-
lastEscapedPos = i + 1;
536-
break;
468+
var escapedChar = escapedCodes[rest.charCodeAt(i)];
469+
if (escapedChar) {
470+
// Concat if there are ordinary characters in the middle.
471+
if (i > lastEscapedPos)
472+
escaped += rest.slice(lastEscapedPos, i);
473+
escaped += escapedChar;
474+
lastEscapedPos = i + 1;
537475
}
538476
}
539477
if (lastEscapedPos === 0) // Nothing has been escaped.

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.