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 adc537df0..675820e9e 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FetchTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FetchTask.java @@ -45,16 +45,6 @@ import static org.jackhuang.hmcl.util.Lang.threadPool; import static org.jackhuang.hmcl.util.logging.Logger.LOG; public abstract class FetchTask extends Task { - private static final HttpClient HTTP_CLIENT; - - static { - boolean useHttp2 = !"false".equalsIgnoreCase(System.getProperty("hmcl.http2")); - - HTTP_CLIENT = HttpClient.newBuilder() - .connectTimeout(Duration.ofMillis(NetworkUtils.TIME_OUT)) - .version(useHttp2 ? HttpClient.Version.HTTP_2 : HttpClient.Version.HTTP_1_1) - .build(); - } protected static final int DEFAULT_RETRY = 3; @@ -221,7 +211,7 @@ public abstract class FetchTask extends Task { HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(currentURI); requestBuilder.timeout(Duration.ofMillis(NetworkUtils.TIME_OUT)); headers.forEach(requestBuilder::header); - response = HTTP_CLIENT.send(requestBuilder.build(), BODY_HANDLER); + response = Holder.HTTP_CLIENT.send(requestBuilder.build(), BODY_HANDLER); bmclapiHash = response.headers().firstValue("x-bmclapi-hash").orElse(null); if (DigestUtils.isSha1Digest(bmclapiHash)) { @@ -509,4 +499,21 @@ public abstract class FetchTask extends Task { public static int getDownloadExecutorConcurrency() { return downloadExecutorConcurrency; } + + /// Ensure that [#HTTP_CLIENT] is initialized after ProxyManager has been initialized. + private static final class Holder { + private static final HttpClient HTTP_CLIENT; + + static { + boolean useHttp2 = !"false".equalsIgnoreCase(System.getProperty("hmcl.http2")); + + HTTP_CLIENT = HttpClient.newBuilder() + .connectTimeout(Duration.ofMillis(NetworkUtils.TIME_OUT)) + .version(useHttp2 ? HttpClient.Version.HTTP_2 : HttpClient.Version.HTTP_1_1) + .build(); + } + + private Holder() { + } + } }