From ba2e4198949cb549e734925ac75d7739a37b7b25 Mon Sep 17 00:00:00 2001 From: huangyuhui Date: Sat, 18 Aug 2018 22:09:16 +0800 Subject: [PATCH] Fix #422 --- .../download/BMCLAPIDownloadProvider.java | 4 +- .../download/game/LibraryDownloadTask.java | 87 +++++++++++++------ .../java/org/jackhuang/hmcl/task/Task.java | 2 +- .../org/jackhuang/hmcl/util/NetworkUtils.java | 13 ++- 4 files changed, 74 insertions(+), 32 deletions(-) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/BMCLAPIDownloadProvider.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/BMCLAPIDownloadProvider.java index 19e05f866..0f6468ebf 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/BMCLAPIDownloadProvider.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/BMCLAPIDownloadProvider.java @@ -64,8 +64,8 @@ public class BMCLAPIDownloadProvider implements DownloadProvider { return baseURL .replace("https://launchermeta.mojang.com", "https://bmclapi2.bangbang93.com") .replace("https://launcher.mojang.com", "https://bmclapi2.bangbang93.com") - .replace("https://libraries.minecraft.net", "https://bmclapi2.bangbang93.com/libraries") - .replaceFirst("https?://files\\.minecraftforge\\.net/maven", "https://bmclapi2.bangbang93.com/maven") + .replace("https://libraries.minecraft.net", "http://bmclapi2.bangbang93.com/libraries") + .replaceFirst("https?://files\\.minecraftforge\\.net/maven", "http://bmclapi2.bangbang93.com/maven") .replace("http://dl.liteloader.com/versions/versions.json", "https://bmclapi2.bangbang93.com/maven/com/mumfrey/liteloader/versions.json") .replace("http://dl.liteloader.com/versions", "https://bmclapi2.bangbang93.com/maven") .replace("https://authlib-injector.yushi.moe", "https://bmclapi2.bangbang93.com/mirrors/authlib-injector"); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/LibraryDownloadTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/LibraryDownloadTask.java index b01a6b508..754efe56e 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/LibraryDownloadTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/LibraryDownloadTask.java @@ -12,7 +12,10 @@ import org.jackhuang.hmcl.util.NetworkUtils; import org.tukaani.xz.XZInputStream; import java.io.*; +import java.net.URL; import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Paths; import java.util.*; import java.util.jar.JarEntry; import java.util.jar.JarInputStream; @@ -23,15 +26,15 @@ import static org.jackhuang.hmcl.util.DigestUtils.digest; import static org.jackhuang.hmcl.util.Hex.encodeHex; public final class LibraryDownloadTask extends Task { - private final FileDownloadTask xzTask; - private final FileDownloadTask task; + private final LibraryDownloadTaskHelper helperTask; private final File jar; private final File xzFile; private final Library library; - - private boolean downloaded = false; + private boolean xz; public LibraryDownloadTask(AbstractDependencyManager dependencyManager, File file, Library library) { + setSignificance(TaskSignificance.MODERATE); + if (library.is("net.minecraftforge", "forge")) library = library.setClassifier("universal"); @@ -42,20 +45,12 @@ public final class LibraryDownloadTask extends Task { xzFile = new File(file.getAbsoluteFile().getParentFile(), file.getName() + ".pack.xz"); - xzTask = new FileDownloadTask(NetworkUtils.toURL(url + ".pack.xz"), - xzFile, null, 1); - xzTask.setSignificance(TaskSignificance.MINOR); - - setSignificance(TaskSignificance.MODERATE); - - task = new FileDownloadTask(NetworkUtils.toURL(url), - file, - library.getDownload().getSha1() != null ? new IntegrityCheck("SHA-1", library.getDownload().getSha1()) : null); + helperTask = new LibraryDownloadTaskHelper(file, url); } @Override public Collection getDependents() { - return library.getChecksums() != null ? Collections.singleton(xzTask) : Collections.singleton(task); + return Collections.singleton(helperTask); } @Override @@ -66,19 +61,61 @@ public final class LibraryDownloadTask extends Task { @Override public void execute() throws Exception { if (!isDependentsSucceeded()) { - // Since FileDownloadTask wraps the actual exception with another IOException. - // We should extract it letting the error message clearer. - Throwable t = library.getChecksums() != null ? xzTask.getLastException() : task.getLastException(); - if (t.getCause() != null && t.getCause() != t) - throw new LibraryDownloadException(library, t.getCause()); - else - throw new LibraryDownloadException(library, t); + if (helperTask.task == null) { + // NetworkUtils.URLExists failed. + throw new LibraryDownloadException(library, helperTask.getLastException()); + } else { + // Since FileDownloadTask wraps the actual exception with another IOException. + // We should extract it letting the error message clearer. + Throwable t = helperTask.task.getLastException(); + if (t.getCause() != null && t.getCause() != t) + throw new LibraryDownloadException(library, t.getCause()); + else + throw new LibraryDownloadException(library, t); + } + } else { + if (xz) { + unpackLibrary(jar, FileUtils.readBytes(xzFile)); + if (!checksumValid(jar, library.getChecksums())) + throw new IOException("Checksum failed for " + library); + } + } + } + + private class LibraryDownloadTaskHelper extends Task { + private FileDownloadTask task; + private final File file; + private final String url; + + public LibraryDownloadTaskHelper(File file, String url) { + this.file = file; + this.url = url; + + setName(library.getName()); } - if (library.getChecksums() != null) { - unpackLibrary(jar, FileUtils.readBytes(xzFile)); - if (!checksumValid(jar, library.getChecksums())) - throw new IOException("Checksum failed for " + library); + @Override + public boolean isRelyingOnDependencies() { + return true; + } + + @Override + public Collection getDependencies() { + return Collections.singleton(task); + } + + @Override + public void execute() throws Exception { + URL packXz = NetworkUtils.toURL(url + ".pack.xz"); + if (NetworkUtils.URLExists(packXz)) { + task = new FileDownloadTask(packXz, xzFile, null); + xz = true; + } else { + task = new FileDownloadTask(NetworkUtils.toURL(url), + file, + library.getDownload().getSha1() != null ? new IntegrityCheck("SHA-1", library.getDownload().getSha1()) : null); + xz = false; + } } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Task.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Task.java index 424c223e9..86500d02d 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Task.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Task.java @@ -108,7 +108,7 @@ public abstract class Task { return true; } - private String name = getClass().toString(); + private String name = getClass().getName(); public String getName() { return name; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/NetworkUtils.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/NetworkUtils.java index 35ed6ce74..36c669987 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/NetworkUtils.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/NetworkUtils.java @@ -17,10 +17,7 @@ */ package org.jackhuang.hmcl.util; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.UncheckedIOException; +import java.io.*; import java.net.*; import java.nio.charset.StandardCharsets; import java.util.Map; @@ -156,4 +153,12 @@ public final class NetworkUtils { return false; } } + + public static boolean URLExists(URL url) throws IOException { + try (InputStream stream = url.openStream()) { + return true; + } catch (FileNotFoundException e) { + return false; + } + } }