From 08552fc6b9a18c736b6fd3939d8e0b434f5b8302 Mon Sep 17 00:00:00 2001 From: Marcos Casagrande Date: Sun, 31 May 2020 22:13:53 +0200 Subject: [PATCH] fix(fetch): network error on multiple redirects (#5985) --- cli/js/web/fetch.ts | 13 ++++++++++--- cli/tests/unit/fetch_test.ts | 5 ++--- tools/http_server.py | 2 +- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/cli/js/web/fetch.ts b/cli/js/web/fetch.ts index a56ebe772e..2f01e7ad72 100644 --- a/cli/js/web/fetch.ts +++ b/cli/js/web/fetch.ts @@ -288,6 +288,7 @@ export async function fetch( } } + let responseInit: ResponseInit = {}; while (remRedirectCount) { const fetchResponse = await sendFetchReq(url, method, headers, body); @@ -314,7 +315,7 @@ export async function fetch( }, }); - let responseInit: ResponseInit = { + responseInit = { status: fetchResponse.status, statusText: fetchResponse.statusText, headers: fetchResponse.headers, @@ -374,6 +375,12 @@ export async function fetch( return response; } } - // Return a network error due to too many redirections - throw notImplemented(); + + responseData.set(responseInit, { + type: "error", + redirected: false, + url: "", + }); + + return new Response(null, responseInit); } diff --git a/cli/tests/unit/fetch_test.ts b/cli/tests/unit/fetch_test.ts index 6dfb23390d..5fd1cc469f 100644 --- a/cli/tests/unit/fetch_test.ts +++ b/cli/tests/unit/fetch_test.ts @@ -245,14 +245,13 @@ unitTest( unitTest( { - // FIXME(bartlomieju): - // The feature below is not implemented, but the test should work after implementation - ignore: true, perms: { net: true }, }, async function fetchWithInfRedirection(): Promise { const response = await fetch("http://localhost:4549/cli/tests"); // will redirect to the same place assertEquals(response.status, 0); // network error + assertEquals(response.type, "error"); + assertEquals(response.ok, false); } ); diff --git a/tools/http_server.py b/tools/http_server.py index 346b319f80..0c4d152f20 100755 --- a/tools/http_server.py +++ b/tools/http_server.py @@ -363,7 +363,7 @@ def start(s): def spawn(): servers = (server(), redirect_server(), another_redirect_server(), double_redirects_server(), https_server(), - absolute_redirect_server()) + absolute_redirect_server(), inf_redirects_server()) # In order to wait for each of the servers to be ready, we try connecting to # them with a tcp socket. for running_server in servers: