fix: retry url in LibraryDownloadTask

This commit is contained in:
huanghongxun
2020-06-01 13:26:28 +08:00
parent 0984c23253
commit 6eb0c16fcc

View File

@@ -25,7 +25,6 @@ import org.jackhuang.hmcl.task.DownloadException;
import org.jackhuang.hmcl.task.FileDownloadTask; import org.jackhuang.hmcl.task.FileDownloadTask;
import org.jackhuang.hmcl.task.FileDownloadTask.IntegrityCheck; import org.jackhuang.hmcl.task.FileDownloadTask.IntegrityCheck;
import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.task.Task;
import org.jackhuang.hmcl.util.Logging;
import org.jackhuang.hmcl.util.io.FileUtils; import org.jackhuang.hmcl.util.io.FileUtils;
import org.jackhuang.hmcl.util.io.IOUtils; import org.jackhuang.hmcl.util.io.IOUtils;
import org.jackhuang.hmcl.util.io.NetworkUtils; import org.jackhuang.hmcl.util.io.NetworkUtils;
@@ -42,6 +41,7 @@ import java.util.logging.Level;
import static org.jackhuang.hmcl.util.DigestUtils.digest; import static org.jackhuang.hmcl.util.DigestUtils.digest;
import static org.jackhuang.hmcl.util.Hex.encodeHex; import static org.jackhuang.hmcl.util.Hex.encodeHex;
import static org.jackhuang.hmcl.util.Logging.LOG;
public class LibraryDownloadTask extends Task<Void> { public class LibraryDownloadTask extends Task<Void> {
private FileDownloadTask task; private FileDownloadTask task;
@@ -111,7 +111,7 @@ public class LibraryDownloadTask extends Task<Void> {
} }
@Override @Override
public void preExecute() throws Exception { public void preExecute() {
Optional<Path> libPath = cacheRepository.getLibrary(originalLibrary); Optional<Path> libPath = cacheRepository.getLibrary(originalLibrary);
if (libPath.isPresent()) { if (libPath.isPresent()) {
try { try {
@@ -119,34 +119,44 @@ public class LibraryDownloadTask extends Task<Void> {
cached = true; cached = true;
return; return;
} catch (IOException e) { } catch (IOException e) {
Logging.LOG.log(Level.WARNING, "Failed to copy file from cache", e); LOG.log(Level.WARNING, "Failed to copy file from cache", e);
// We cannot copy cached file to current location // We cannot copy cached file to current location
// so we try to download a new one. // so we try to download a new one.
} }
} }
try { if (testURLExistence(url)) {
URL packXz = NetworkUtils.toURL(dependencyManager.getDownloadProvider().injectURL(url) + ".pack.xz"); List<URL> urls = dependencyManager.getDownloadProvider().injectURLWithCandidates(url + ".pack.xz");
if (NetworkUtils.urlExists(packXz)) { task = new FileDownloadTask(urls, xzFile, null);
List<URL> urls = dependencyManager.getDownloadProvider().injectURLWithCandidates(url + ".pack.xz"); task.setCacheRepository(cacheRepository);
task = new FileDownloadTask(urls, xzFile, null); task.setCaching(true);
task.setCacheRepository(cacheRepository); xz = true;
task.setCaching(true); } else {
xz = true; List<URL> urls = dependencyManager.getDownloadProvider().injectURLWithCandidates(url);
} else { task = new FileDownloadTask(urls, jar,
List<URL> urls = dependencyManager.getDownloadProvider().injectURLWithCandidates(url); library.getDownload().getSha1() != null ? new IntegrityCheck("SHA-1", library.getDownload().getSha1()) : null);
task = new FileDownloadTask(urls, jar, task.setCacheRepository(cacheRepository);
library.getDownload().getSha1() != null ? new IntegrityCheck("SHA-1", library.getDownload().getSha1()) : null); task.setCaching(true);
task.setCacheRepository(cacheRepository); task.addIntegrityCheckHandler(FileDownloadTask.ZIP_INTEGRITY_CHECK_HANDLER);
task.setCaching(true); xz = false;
task.addIntegrityCheckHandler(FileDownloadTask.ZIP_INTEGRITY_CHECK_HANDLER);
xz = false;
}
} catch (IOException e) {
throw new LibraryDownloadException(library, e);
} }
} }
private boolean testURLExistence(String rawUrl) {
List<URL> urls = dependencyManager.getDownloadProvider().injectURLWithCandidates(rawUrl);
for (URL url : urls) {
URL xzURL = NetworkUtils.toURL(url.toString() + ".pack.xz");
for (int retry = 0; retry < 3; retry++) {
try {
return NetworkUtils.urlExists(xzURL);
} catch (IOException e) {
LOG.log(Level.WARNING, "Failed to test for url existence: " + rawUrl + ".pack.xz", e);
}
}
}
return false; // maybe some ugly implementation will give timeout for not existent url.
}
@Override @Override
public boolean doPostExecute() { public boolean doPostExecute() {
return true; return true;
@@ -201,11 +211,11 @@ public class LibraryDownloadTask extends Task<Void> {
String target = hash.substring(validChecksum.length() + 1); String target = hash.substring(validChecksum.length() + 1);
String checksum = files.get(target); String checksum = files.get(target);
if ((!files.containsKey(target)) || (checksum == null)) { if ((!files.containsKey(target)) || (checksum == null)) {
Logging.LOG.warning(" " + target + " : missing"); LOG.warning(" " + target + " : missing");
failed = true; failed = true;
break; break;
} else if (!checksum.equals(validChecksum)) { } else if (!checksum.equals(validChecksum)) {
Logging.LOG.warning(" " + target + " : failed (" + checksum + ", " + validChecksum + ")"); LOG.warning(" " + target + " : failed (" + checksum + ", " + validChecksum + ")");
failed = true; failed = true;
break; break;
} }