mirror of
https://github.com/denoland/deno.git
synced 2025-03-03 17:34:47 -05:00
fix: Allow isolated "%"s when parsing file URLs (#7108)
This commit is contained in:
parent
fd83df7cdb
commit
cf603be24c
4 changed files with 14 additions and 4 deletions
|
@ -63,11 +63,13 @@
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Keep in sync with `fromFileUrl()` in `std/path/win32.ts`.
|
||||||
function pathFromURLWin32(url) {
|
function pathFromURLWin32(url) {
|
||||||
let path = decodeURIComponent(
|
let path = decodeURIComponent(
|
||||||
url.pathname
|
url.pathname
|
||||||
.replace(/^\/*([A-Za-z]:)(\/|$)/, "$1/")
|
.replace(/^\/*([A-Za-z]:)(\/|$)/, "$1/")
|
||||||
.replace(/\//g, "\\"),
|
.replace(/\//g, "\\")
|
||||||
|
.replace(/%(?![0-9A-Fa-f]{2})/g, "%25"),
|
||||||
);
|
);
|
||||||
if (url.hostname != "") {
|
if (url.hostname != "") {
|
||||||
// Note: The `URL` implementation guarantees that the drive letter and
|
// Note: The `URL` implementation guarantees that the drive letter and
|
||||||
|
@ -78,12 +80,15 @@
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Keep in sync with `fromFileUrl()` in `std/path/posix.ts`.
|
||||||
function pathFromURLPosix(url) {
|
function pathFromURLPosix(url) {
|
||||||
if (url.hostname !== "") {
|
if (url.hostname !== "") {
|
||||||
throw new TypeError(`Host must be empty.`);
|
throw new TypeError(`Host must be empty.`);
|
||||||
}
|
}
|
||||||
|
|
||||||
return decodeURIComponent(url.pathname);
|
return decodeURIComponent(
|
||||||
|
url.pathname.replace(/%(?![0-9A-Fa-f]{2})/g, "%25"),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function pathFromURL(pathOrUrl) {
|
function pathFromURL(pathOrUrl) {
|
||||||
|
|
|
@ -7,6 +7,7 @@ Deno.test("[path] fromFileUrl", function () {
|
||||||
assertEquals(posix.fromFileUrl("file:///"), "/");
|
assertEquals(posix.fromFileUrl("file:///"), "/");
|
||||||
assertEquals(posix.fromFileUrl("file:///home/foo"), "/home/foo");
|
assertEquals(posix.fromFileUrl("file:///home/foo"), "/home/foo");
|
||||||
assertEquals(posix.fromFileUrl("file:///home/foo%20bar"), "/home/foo bar");
|
assertEquals(posix.fromFileUrl("file:///home/foo%20bar"), "/home/foo bar");
|
||||||
|
assertEquals(posix.fromFileUrl("file:///%"), "/%");
|
||||||
assertEquals(posix.fromFileUrl("file://localhost/foo"), "/foo");
|
assertEquals(posix.fromFileUrl("file://localhost/foo"), "/foo");
|
||||||
assertEquals(posix.fromFileUrl("file:///C:"), "/C:");
|
assertEquals(posix.fromFileUrl("file:///C:"), "/C:");
|
||||||
assertEquals(posix.fromFileUrl("file:///C:/"), "/C:/");
|
assertEquals(posix.fromFileUrl("file:///C:/"), "/C:/");
|
||||||
|
@ -29,6 +30,7 @@ Deno.test("[path] fromFileUrl (win32)", function () {
|
||||||
assertEquals(win32.fromFileUrl("file:///"), "\\");
|
assertEquals(win32.fromFileUrl("file:///"), "\\");
|
||||||
assertEquals(win32.fromFileUrl("file:///home/foo"), "\\home\\foo");
|
assertEquals(win32.fromFileUrl("file:///home/foo"), "\\home\\foo");
|
||||||
assertEquals(win32.fromFileUrl("file:///home/foo%20bar"), "\\home\\foo bar");
|
assertEquals(win32.fromFileUrl("file:///home/foo%20bar"), "\\home\\foo bar");
|
||||||
|
assertEquals(win32.fromFileUrl("file:///%"), "\\%");
|
||||||
assertEquals(win32.fromFileUrl("file://localhost/foo"), "\\\\localhost\\foo");
|
assertEquals(win32.fromFileUrl("file://localhost/foo"), "\\\\localhost\\foo");
|
||||||
assertEquals(win32.fromFileUrl("file:///C:"), "C:\\");
|
assertEquals(win32.fromFileUrl("file:///C:"), "C:\\");
|
||||||
assertEquals(win32.fromFileUrl("file:///C:/"), "C:\\");
|
assertEquals(win32.fromFileUrl("file:///C:/"), "C:\\");
|
||||||
|
|
|
@ -436,5 +436,7 @@ export function fromFileUrl(url: string | URL): string {
|
||||||
if (url.protocol != "file:") {
|
if (url.protocol != "file:") {
|
||||||
throw new TypeError("Must be a file URL.");
|
throw new TypeError("Must be a file URL.");
|
||||||
}
|
}
|
||||||
return decodeURIComponent(url.pathname);
|
return decodeURIComponent(
|
||||||
|
url.pathname.replace(/%(?![0-9A-Fa-f]{2})/g, "%25"),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -919,7 +919,8 @@ export function fromFileUrl(url: string | URL): string {
|
||||||
let path = decodeURIComponent(
|
let path = decodeURIComponent(
|
||||||
url.pathname
|
url.pathname
|
||||||
.replace(/^\/*([A-Za-z]:)(\/|$)/, "$1/")
|
.replace(/^\/*([A-Za-z]:)(\/|$)/, "$1/")
|
||||||
.replace(/\//g, "\\"),
|
.replace(/\//g, "\\")
|
||||||
|
.replace(/%(?![0-9A-Fa-f]{2})/g, "%25"),
|
||||||
);
|
);
|
||||||
if (url.hostname != "") {
|
if (url.hostname != "") {
|
||||||
// Note: The `URL` implementation guarantees that the drive letter and
|
// Note: The `URL` implementation guarantees that the drive letter and
|
||||||
|
|
Loading…
Add table
Reference in a new issue