From 2e09a40b698b1488758ed66d3d5a063fda972d5e Mon Sep 17 00:00:00 2001 From: Glavo Date: Sat, 4 Oct 2025 21:11:44 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20FetchTask=20=E4=B8=8D?= =?UTF-8?q?=E9=81=B5=E5=BE=AA=E4=BB=A3=E7=90=86=E8=AE=BE=E7=BD=AE=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=20(#4596)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/jackhuang/hmcl/task/FetchTask.java | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) 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() { + } + } }