mirror of
https://github.com/denoland/deno.git
synced 2024-11-22 04:51:22 +00:00
fix(cli/fetch): fix relative redirect (#6715)
This commit is contained in:
parent
ac000341db
commit
4aeac64ecd
@ -342,11 +342,7 @@ export async function fetch(
|
||||
!redirectUrl.startsWith("http://") &&
|
||||
!redirectUrl.startsWith("https://")
|
||||
) {
|
||||
redirectUrl =
|
||||
url.split("//")[0] +
|
||||
"//" +
|
||||
url.split("//")[1].split("/")[0] +
|
||||
redirectUrl; // TODO: handle relative redirection more gracefully
|
||||
redirectUrl = new URL(redirectUrl, url).href;
|
||||
}
|
||||
url = redirectUrl;
|
||||
redirected = true;
|
||||
|
@ -335,6 +335,27 @@ unitTest(
|
||||
}
|
||||
);
|
||||
|
||||
unitTest(
|
||||
{
|
||||
perms: { net: true },
|
||||
},
|
||||
async function fetchWithRelativeRedirectionUrl(): Promise<void> {
|
||||
const cases = [
|
||||
["end", "http://localhost:4550/a/b/end"],
|
||||
["/end", "http://localhost:4550/end"],
|
||||
];
|
||||
for (const [loc, redUrl] of cases) {
|
||||
const response = await fetch("http://localhost:4550/a/b/c", {
|
||||
headers: new Headers([["x-location", loc]]),
|
||||
});
|
||||
assertEquals(response.url, redUrl);
|
||||
assertEquals(response.redirected, true);
|
||||
assertEquals(response.status, 404);
|
||||
assertEquals(await response.text(), "");
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
unitTest(
|
||||
{
|
||||
perms: { net: true },
|
||||
|
@ -240,6 +240,19 @@ unitTest(function urlBaseURL(): void {
|
||||
);
|
||||
const url = new URL("/foo/bar?baz=foo#qux", base);
|
||||
assertEquals(url.href, "https://foo:bar@baz.qat:8000/foo/bar?baz=foo#qux");
|
||||
|
||||
assertEquals(
|
||||
new URL("D", "https://foo.bar/path/a/b/c/d").href,
|
||||
"https://foo.bar/path/a/b/c/D"
|
||||
);
|
||||
|
||||
assertEquals(new URL("D", "https://foo.bar").href, "https://foo.bar/D");
|
||||
assertEquals(new URL("D", "https://foo.bar/").href, "https://foo.bar/D");
|
||||
|
||||
assertEquals(
|
||||
new URL("/d", "https://foo.bar/path/a/b/c/d").href,
|
||||
"https://foo.bar/d"
|
||||
);
|
||||
});
|
||||
|
||||
unitTest(function urlBaseString(): void {
|
||||
|
@ -146,6 +146,14 @@ pub async fn run_all_servers() {
|
||||
let u = url.parse::<Uri>().unwrap();
|
||||
warp::redirect(u)
|
||||
})
|
||||
.or(
|
||||
warp::path!("a" / "b" / "c")
|
||||
.and(warp::header::<String>("x-location"))
|
||||
.map(|token: String| {
|
||||
let uri: Uri = token.parse().unwrap();
|
||||
warp::redirect(uri)
|
||||
}),
|
||||
)
|
||||
.or(
|
||||
warp::any()
|
||||
.and(warp::path::peek())
|
||||
|
Loading…
Reference in New Issue
Block a user