From ac31fe52e9478a2b146b6caf22ac922cd56d8e9a Mon Sep 17 00:00:00 2001 From: "Thomas (Tom) Piccirello" <8296030+Piccirello@users.noreply.github.com> Date: Fri, 5 Sep 2025 05:32:43 -0700 Subject: [PATCH] WebUI: Continue polling after network error These `fetch` calls properly handle 4xx and 5xx errors, but don't handle network errors. In all cases, I've used the same logic as the `!response.ok` branch of each individual fetch function. This should ensure consistent behavior. PR #23164. --- src/webui/www/private/scripts/addtorrent.js | 4 ++++ src/webui/www/private/scripts/prop-general.js | 12 ++++++++++++ src/webui/www/private/scripts/search.js | 5 +++++ src/webui/www/private/views/log.html | 6 ++++++ 4 files changed, 27 insertions(+) diff --git a/src/webui/www/private/scripts/addtorrent.js b/src/webui/www/private/scripts/addtorrent.js index dd026d8e9..4990eff28 100644 --- a/src/webui/www/private/scripts/addtorrent.js +++ b/src/webui/www/private/scripts/addtorrent.js @@ -241,6 +241,10 @@ window.qBittorrent.AddTorrent ??= (() => { metadataCompleted(); else loadMetadataTimer = loadMetadata.delay(1000); + }, (error) => { + console.error(error); + + loadMetadataTimer = loadMetadata.delay(1000); }); }; diff --git a/src/webui/www/private/scripts/prop-general.js b/src/webui/www/private/scripts/prop-general.js index fce3c84a6..55d154cf7 100644 --- a/src/webui/www/private/scripts/prop-general.js +++ b/src/webui/www/private/scripts/prop-general.js @@ -234,6 +234,12 @@ window.qBittorrent.PropGeneral ??= (() => { } clearTimeout(loadTorrentDataTimer); loadTorrentDataTimer = loadTorrentData.delay(5000); + }, (error) => { + console.error(error); + + document.getElementById("error_div").textContent = "QBT_TR(qBittorrent client is not reachable)QBT_TR[CONTEXT=HttpServer]"; + clearTimeout(loadTorrentDataTimer); + loadTorrentDataTimer = loadTorrentData.delay(10000); }); const pieceStatesURL = new URL("api/v2/torrents/pieceStates", window.location); @@ -262,6 +268,12 @@ window.qBittorrent.PropGeneral ??= (() => { clearTimeout(loadTorrentDataTimer); loadTorrentDataTimer = loadTorrentData.delay(5000); + }, (error) => { + console.error(error); + + document.getElementById("error_div").textContent = "QBT_TR(qBittorrent client is not reachable)QBT_TR[CONTEXT=HttpServer]"; + clearTimeout(loadTorrentDataTimer); + loadTorrentDataTimer = loadTorrentData.delay(10000); }); }; diff --git a/src/webui/www/private/scripts/search.js b/src/webui/www/private/scripts/search.js index c3ab21539..90c099467 100644 --- a/src/webui/www/private/scripts/search.js +++ b/src/webui/www/private/scripts/search.js @@ -917,6 +917,11 @@ window.qBittorrent.Search ??= (() => { clearTimeout(state.loadResultsTimer); state.loadResultsTimer = loadSearchResultsData.delay(2000, this, searchId); + }, (error) => { + console.error(error); + + clearTimeout(state.loadResultsTimer); + state.loadResultsTimer = loadSearchResultsData.delay(3000, this, searchId); }); }; diff --git a/src/webui/www/private/views/log.html b/src/webui/www/private/views/log.html index 5fde56899..2b51b5643 100644 --- a/src/webui/www/private/views/log.html +++ b/src/webui/www/private/views/log.html @@ -416,6 +416,12 @@ tableInfo[curTab].progress = false; syncLogWithInterval(getSyncLogDataInterval()); + }, (error) => { + console.error(error); + + document.getElementById("error_div").textContent = "QBT_TR(qBittorrent client is not reachable)QBT_TR[CONTEXT=HttpServer]"; + tableInfo[curTab].progress = false; + syncLogWithInterval(10000); }); };