diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FileDownloadTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FileDownloadTask.java index 0e0830deb..eaec71491 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FileDownloadTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FileDownloadTask.java @@ -222,8 +222,14 @@ public class FileDownloadTask extends Task { if (con.getResponseCode() == HttpURLConnection.HTTP_NOT_MODIFIED) { // Handle cache - Path cache = repository.getCachedRemoteFile(con); - FileUtils.copyFile(cache.toFile(), file); + try { + Path cache = repository.getCachedRemoteFile(con); + FileUtils.copyFile(cache.toFile(), file); + return; + } catch (IOException e) { + Logging.LOG.log(Level.WARNING, "Unable to use cached file, redownload it", e); + repository.removeRemoteEntry(con); + } } else if (con.getResponseCode() / 100 != 2) { throw new IOException("Server error, response code: " + con.getResponseCode()); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/GetTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/GetTask.java index 5ee639722..14920b760 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/GetTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/GetTask.java @@ -96,11 +96,17 @@ public final class GetTask extends TaskResult { if (checkETag) repository.injectConnection(conn); conn.connect(); - if (conn.getResponseCode() == 304) { + if (conn.getResponseCode() == HttpURLConnection.HTTP_NOT_MODIFIED) { // Handle cache - Path cache = repository.getCachedRemoteFile(conn); - setResult(FileUtils.readText(cache)); - return; + try { + Path cache = repository.getCachedRemoteFile(conn); + setResult(FileUtils.readText(cache)); + return; + } catch (IOException e) { + Logging.LOG.log(Level.WARNING, "Unable to use cached file, redownload it", e); + repository.removeRemoteEntry(conn); + continue; + } } else if (conn.getResponseCode() / 100 != 2) { throw new IOException("Server error, response code: " + conn.getResponseCode()); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/CacheRepository.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/CacheRepository.java index cc07c76f7..49497bf53 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/CacheRepository.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/CacheRepository.java @@ -164,6 +164,16 @@ public class CacheRepository { return file; } + public void removeRemoteEntry(URLConnection conn) { + String url = conn.getURL().toString(); + lock.readLock().lock(); + try { + index.remove(url); + } finally { + lock.readLock().unlock(); + } + } + public void injectConnection(URLConnection conn) { String url = conn.getURL().toString(); lock.readLock().lock();