From ab6e8692ad23f0c76a32a56fe9daed5cc53104b8 Mon Sep 17 00:00:00 2001 From: Glavo Date: Sun, 23 Nov 2025 15:20:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BC=93=E5=AD=98=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E6=97=B6=20FetchTask=20=E6=97=A0=E9=99=90=E5=BE=AA?= =?UTF-8?q?=E7=8E=AF=E7=9A=84=E9=97=AE=E9=A2=98=20(#4844)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/jackhuang/hmcl/upgrade/UpdateChecker.java | 2 +- .../main/java/org/jackhuang/hmcl/task/FetchTask.java | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateChecker.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateChecker.java index 1504828d7..7d4fa507c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateChecker.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateChecker.java @@ -112,7 +112,7 @@ public final class UpdateChecker { try { result = checkUpdate(channel, preview); LOG.info("Latest version (" + channel + ", preview=" + preview + ") is " + result); - } catch (IOException e) { + } catch (Throwable e) { LOG.warning("Failed to check for update", e); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FetchTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FetchTask.java index 675820e9e..f8c6e7622 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FetchTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FetchTask.java @@ -187,7 +187,9 @@ public abstract class FetchTask extends Task { ArrayList exceptions = null; - for (int retryTime = 0; retryTime < retry; retryTime++) { + // If loading the cache fails, the cache should not be loaded again. + boolean useCachedResult = true; + for (int retryTime = 0, retryLimit = retry; retryTime < retryLimit; retryTime++) { if (isCancelled()) { throw new InterruptedException(); } @@ -204,7 +206,7 @@ public abstract class FetchTask extends Task { LinkedHashMap headers = new LinkedHashMap<>(); headers.put("accept-encoding", "gzip"); - if (checkETag) + if (useCachedResult && checkETag) headers.putAll(repository.injectConnection(uri)); do { @@ -248,7 +250,7 @@ public abstract class FetchTask extends Task { } while (true); int responseCode = response.statusCode(); - if (responseCode == HttpURLConnection.HTTP_NOT_MODIFIED) { + if (useCachedResult && responseCode == HttpURLConnection.HTTP_NOT_MODIFIED) { // Handle cache try { Path cache = repository.getCachedRemoteFile(currentURI, false); @@ -260,9 +262,10 @@ public abstract class FetchTask extends Task { } catch (IOException e) { LOG.warning("Unable to use cached file, redownload " + NetworkUtils.dropQuery(uri), e); repository.removeRemoteEntry(currentURI); + useCachedResult = false; // Now we must reconnect the server since 304 may result in empty content, // if we want to redownload the file, we must reconnect the server without etag settings. - retryTime--; + retryLimit++; continue; } } else if (responseCode / 100 == 4) {