fix: retry url in LibraryDownloadTask
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user