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) {