Skip to content

Commit 4dc1ae0

Browse files
authored
url: modify pathToFileURL to handle extended UNC path
PR-URL: #54262 Reviewed-By: Antoine du Hamel <[email protected]> Reviewed-By: James M Snell <[email protected]>
1 parent b8a2550 commit 4dc1ae0

File tree

2 files changed

+11
-2
lines changed

2 files changed

+11
-2
lines changed

lib/internal/url.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1540,7 +1540,12 @@ function pathToFileURL(filepath, options = kEmptyObject) {
15401540
if ((windows ?? isWindows) && StringPrototypeStartsWith(filepath, '\\\\')) {
15411541
const outURL = new URL('file://');
15421542
// UNC path format: \\server\share\resource
1543-
const hostnameEndIndex = StringPrototypeIndexOf(filepath, '\\', 2);
1543+
// Handle extended UNC path and standard UNC path
1544+
// "\\?\UNC\" path prefix should be ignored.
1545+
// Ref: https://learn.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation
1546+
const isExtendedUNC = StringPrototypeStartsWith(filepath, '\\\\?\\UNC\\');
1547+
const prefixLength = isExtendedUNC ? 8 : 2;
1548+
const hostnameEndIndex = StringPrototypeIndexOf(filepath, '\\', prefixLength);
15441549
if (hostnameEndIndex === -1) {
15451550
throw new ERR_INVALID_ARG_VALUE(
15461551
'path',
@@ -1555,7 +1560,7 @@ function pathToFileURL(filepath, options = kEmptyObject) {
15551560
'Empty UNC servername',
15561561
);
15571562
}
1558-
const hostname = StringPrototypeSlice(filepath, 2, hostnameEndIndex);
1563+
const hostname = StringPrototypeSlice(filepath, prefixLength, hostnameEndIndex);
15591564
outURL.hostname = domainToASCII(hostname);
15601565
outURL.pathname = encodePathChars(
15611566
RegExpPrototypeSymbolReplace(backslashRegEx, StringPrototypeSlice(filepath, hostnameEndIndex), '/'),

test/parallel/test-url-pathtofileurl.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,12 @@ const windowsTestCases = [
104104
{ path: 'C:\\€', expected: 'file:///C:/%E2%82%AC' },
105105
// Rocket emoji (non-BMP code point)
106106
{ path: 'C:\\🚀', expected: 'file:///C:/%F0%9F%9A%80' },
107+
// Local extended path
108+
{ path: '\\\\?\\C:\\path\\to\\file.txt', expected: 'file:///C:/path/to/file.txt' },
107109
// UNC path (see https://docs.microsoft.com/en-us/archive/blogs/ie/file-uris-in-windows)
108110
{ path: '\\\\nas\\My Docs\\File.doc', expected: 'file://nas/My%20Docs/File.doc' },
111+
// Extended UNC path
112+
{ path: '\\\\?\\UNC\\server\\share\\folder\\file.txt', expected: 'file://server/share/folder/file.txt' },
109113
];
110114
const posixTestCases = [
111115
// Lowercase ascii alpha

0 commit comments

Comments
 (0)