GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — url: reduce `pathToFileURL` cpp calls · nodejs/node@2441415

File tree

Expand file treeCollapse file tree
Open diff view settings
Filter options
  • lib/internal
    • url.js
Expand file treeCollapse file tree
Open diff view settings
Collapse file

‎lib/internal/url.js‎

Copy file name to clipboardExpand all lines: lib/internal/url.js
+30-17Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1496,25 +1496,27 @@ const backslashRegEx = /\\/g;
14961496
const newlineRegEx = /\n/g;
14971497
const carriageReturnRegEx = /\r/g;
14981498
const tabRegEx = /\t/g;
1499+
const questionRegex = /\?/g;
1500+
const hashRegex = /#/g;
14991501

15001502
function encodePathChars(filepath) {
1501-
if (StringPrototypeIncludes(filepath, '%'))
1503+
if (StringPrototypeIndexOf(filepath, '%') !== -1)
15021504
filepath = RegExpPrototypeSymbolReplace(percentRegEx, filepath, '%25');
15031505
// In posix, backslash is a valid character in paths:
1504-
if (!isWindows && StringPrototypeIncludes(filepath, '\\'))
1506+
if (!isWindows && StringPrototypeIndexOf(filepath, '\\') !== -1)
15051507
filepath = RegExpPrototypeSymbolReplace(backslashRegEx, filepath, '%5C');
1506-
if (StringPrototypeIncludes(filepath, '\n'))
1508+
if (StringPrototypeIndexOf(filepath, '\n') !== -1)
15071509
filepath = RegExpPrototypeSymbolReplace(newlineRegEx, filepath, '%0A');
1508-
if (StringPrototypeIncludes(filepath, '\r'))
1510+
if (StringPrototypeIndexOf(filepath, '\r') !== -1)
15091511
filepath = RegExpPrototypeSymbolReplace(carriageReturnRegEx, filepath, '%0D');
1510-
if (StringPrototypeIncludes(filepath, '\t'))
1512+
if (StringPrototypeIndexOf(filepath, '\t') !== -1)
15111513
filepath = RegExpPrototypeSymbolReplace(tabRegEx, filepath, '%09');
15121514
return filepath;
15131515
}
15141516

15151517
function pathToFileURL(filepath) {
1516-
const outURL = new URL('file://');
15171518
if (isWindows && StringPrototypeStartsWith(filepath, '\\\\')) {
1519+
const outURL = new URL('file://');
15181520
// UNC path format: \\server\share\resource
15191521
const hostnameEndIndex = StringPrototypeIndexOf(filepath, '\\', 2);
15201522
if (hostnameEndIndex === -1) {
@@ -1535,18 +1537,29 @@ function pathToFileURL(filepath) {
15351537
outURL.hostname = domainToASCII(hostname);
15361538
outURL.pathname = encodePathChars(
15371539
RegExpPrototypeSymbolReplace(backslashRegEx, StringPrototypeSlice(filepath, hostnameEndIndex), '/'));
1538-
} else {
1539-
let resolved = path.resolve(filepath);
1540-
// path.resolve strips trailing slashes so we must add them back
1541-
const filePathLast = StringPrototypeCharCodeAt(filepath,
1542-
filepath.length - 1);
1543-
if ((filePathLast === CHAR_FORWARD_SLASH ||
1544-
(isWindows && filePathLast === CHAR_BACKWARD_SLASH)) &&
1545-
resolved[resolved.length - 1] !== path.sep)
1546-
resolved += '/';
1547-
outURL.pathname = encodePathChars(resolved);
1540+
return outURL;
15481541
}
1549-
return outURL;
1542+
let resolved = path.resolve(filepath);
1543+
// path.resolve strips trailing slashes so we must add them back
1544+
const filePathLast = StringPrototypeCharCodeAt(filepath,
1545+
filepath.length - 1);
1546+
if ((filePathLast === CHAR_FORWARD_SLASH ||
1547+
(isWindows && filePathLast === CHAR_BACKWARD_SLASH)) &&
1548+
resolved[resolved.length - 1] !== path.sep)
1549+
resolved += '/';
1550+
1551+
// Call encodePathChars first to avoid encoding % again for ? and #.
1552+
resolved = encodePathChars(resolved);
1553+
1554+
// Question and hash character should be included in pathname.
1555+
// Therefore, encoding is required to eliminate parsing them in different states.
1556+
// This is done as an optimization to not creating a URL instance and
1557+
// later triggering pathname setter, which impacts performance
1558+
if (StringPrototypeIndexOf(resolved, '?') !== -1)
1559+
resolved = RegExpPrototypeSymbolReplace(questionRegex, resolved, '%3F');
1560+
if (StringPrototypeIndexOf(resolved, '#') !== -1)
1561+
resolved = RegExpPrototypeSymbolReplace(hashRegex, resolved, '%23');
1562+
return new URL(`file://${resolved}`);
15501563
}
15511564

15521565
function toPathIfFileURL(fileURLOrPath) {

0 commit comments

Comments
0 (0)
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.