From 2186095651fe77085649c977a25afa7fe9224523 Mon Sep 17 00:00:00 2001 From: ToobLac Date: Sat, 13 Jun 2026 14:12:29 +0800 Subject: [PATCH 1/4] cf api key --- .../mod/curse/CurseForgeRemoteModRepository.java | 3 ++- .../java/org/jackhuang/hmcl/task/FetchTask.java | 2 +- .../org/jackhuang/hmcl/util/io/NetworkUtils.java | 16 ++++++++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseForgeRemoteModRepository.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseForgeRemoteModRepository.java index be13565678..3c4e194cc7 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseForgeRemoteModRepository.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseForgeRemoteModRepository.java @@ -47,9 +47,10 @@ public final class CurseForgeRemoteModRepository implements RemoteModRepository { private static final String PREFIX = "https://api.curseforge.com"; - private static final String apiKey = System.getProperty("hmcl.curseforge.apikey", JarUtils.getAttribute("hmcl.curseforge.apikey", "")); private static final Semaphore SEMAPHORE = new Semaphore(16); + public static final String apiKey = System.getProperty("hmcl.curseforge.apikey", JarUtils.getAttribute("hmcl.curseforge.apikey", "")); + private static final int WORD_PERFECT_MATCH_WEIGHT = 5; private static R withApiKey(R request) { 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 44c3c98ca5..42ce1ac536 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FetchTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FetchTask.java @@ -329,7 +329,7 @@ private void downloadHttp(URI uri, boolean checkETag) throws DownloadException, } do { - HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(currentURI) + HttpRequest.Builder requestBuilder = NetworkUtils.newRequestBuilder(currentURI) .timeout(NetworkUtils.TIMEOUT) .header("User-Agent", NetworkUtils.USER_AGENT); headers.forEach(requestBuilder::header); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/NetworkUtils.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/NetworkUtils.java index 10fecd97b0..67da6c56ff 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/NetworkUtils.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/NetworkUtils.java @@ -18,6 +18,7 @@ package org.jackhuang.hmcl.util.io; import org.glavo.url.WebURL; +import org.jackhuang.hmcl.mod.curse.CurseForgeRemoteModRepository; import org.jackhuang.hmcl.util.Pair; import org.jackhuang.hmcl.util.StringUtils; import org.jetbrains.annotations.NotNull; @@ -25,6 +26,7 @@ import java.io.*; import java.net.*; +import java.net.http.HttpRequest; import java.nio.charset.Charset; import java.time.Duration; import java.util.*; @@ -163,6 +165,20 @@ public static URI dropQuery(URI u) { } } + private static final Map apiKeys = Map.of( + "api.curseforge.com", CurseForgeRemoteModRepository.apiKey, + "edge.forgecdn.net", CurseForgeRemoteModRepository.apiKey + ); + + public static java.net.http.HttpRequest.Builder newRequestBuilder(URI uri) { + String host = uri.getHost().toLowerCase(Locale.ROOT); + String apiKey; + var builder = HttpRequest.newBuilder(uri); + if (StringUtils.isNotBlank((apiKey = apiKeys.get(host)))) + builder.header("x-api-key", apiKey); + return builder; + } + public static URLConnection createConnection(WebURL url) throws IOException { URLConnection connection; try { From 83138b6f53d953576ce4c9d80ffc606738a71ac3 Mon Sep 17 00:00:00 2001 From: ToobLac Date: Sat, 13 Jun 2026 14:17:08 +0800 Subject: [PATCH 2/4] update --- .../src/main/java/org/jackhuang/hmcl/util/io/NetworkUtils.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/NetworkUtils.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/NetworkUtils.java index 67da6c56ff..7ccdad9709 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/NetworkUtils.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/NetworkUtils.java @@ -26,7 +26,6 @@ import java.io.*; import java.net.*; -import java.net.http.HttpRequest; import java.nio.charset.Charset; import java.time.Duration; import java.util.*; @@ -173,7 +172,7 @@ public static URI dropQuery(URI u) { public static java.net.http.HttpRequest.Builder newRequestBuilder(URI uri) { String host = uri.getHost().toLowerCase(Locale.ROOT); String apiKey; - var builder = HttpRequest.newBuilder(uri); + var builder = java.net.http.HttpRequest.newBuilder(uri); if (StringUtils.isNotBlank((apiKey = apiKeys.get(host)))) builder.header("x-api-key", apiKey); return builder; From c3d03b5039ee9d24eae4e68a77d7f6e9007fcf09 Mon Sep 17 00:00:00 2001 From: ToobLac Date: Sat, 13 Jun 2026 15:55:23 +0800 Subject: [PATCH 3/4] update --- .../hmcl/mod/curse/CurseForgeRemoteModRepository.java | 8 ++++---- .../java/org/jackhuang/hmcl/util/io/NetworkUtils.java | 11 +++++------ 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseForgeRemoteModRepository.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseForgeRemoteModRepository.java index 3c4e194cc7..0f18a9eb6b 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseForgeRemoteModRepository.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseForgeRemoteModRepository.java @@ -49,19 +49,19 @@ public final class CurseForgeRemoteModRepository implements RemoteModRepository private static final String PREFIX = "https://api.curseforge.com"; private static final Semaphore SEMAPHORE = new Semaphore(16); - public static final String apiKey = System.getProperty("hmcl.curseforge.apikey", JarUtils.getAttribute("hmcl.curseforge.apikey", "")); + public static final String API_KEY = System.getProperty("hmcl.curseforge.apikey", JarUtils.getAttribute("hmcl.curseforge.apikey", "")); private static final int WORD_PERFECT_MATCH_WEIGHT = 5; private static R withApiKey(R request) { - if (request.getUrl().startsWith(PREFIX) && !apiKey.isEmpty()) { - request.header("X-API-KEY", apiKey); + if (request.getUrl().startsWith(PREFIX) && !API_KEY.isEmpty()) { + request.header("X-API-KEY", API_KEY); } return request; } public static boolean isAvailable() { - return !apiKey.isEmpty(); + return !API_KEY.isEmpty(); } private final Type type; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/NetworkUtils.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/NetworkUtils.java index 7ccdad9709..28197b80c8 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/NetworkUtils.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/NetworkUtils.java @@ -164,16 +164,15 @@ public static URI dropQuery(URI u) { } } - private static final Map apiKeys = Map.of( - "api.curseforge.com", CurseForgeRemoteModRepository.apiKey, - "edge.forgecdn.net", CurseForgeRemoteModRepository.apiKey + private static final Map API_KEYS = Map.of( + "api.curseforge.com", CurseForgeRemoteModRepository.API_KEY, + "edge.forgecdn.net", CurseForgeRemoteModRepository.API_KEY ); public static java.net.http.HttpRequest.Builder newRequestBuilder(URI uri) { - String host = uri.getHost().toLowerCase(Locale.ROOT); - String apiKey; var builder = java.net.http.HttpRequest.newBuilder(uri); - if (StringUtils.isNotBlank((apiKey = apiKeys.get(host)))) + var apiKey = API_KEYS.get(uri.getHost().toLowerCase(Locale.ROOT)); + if (StringUtils.isNotBlank(apiKey)) builder.header("x-api-key", apiKey); return builder; } From e288ada2062e001f24e2caaea110a2b7cb120245 Mon Sep 17 00:00:00 2001 From: ToobLac Date: Sun, 14 Jun 2026 10:47:38 +0800 Subject: [PATCH 4/4] update --- .../main/java/org/jackhuang/hmcl/util/io/NetworkUtils.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/NetworkUtils.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/NetworkUtils.java index 28197b80c8..ea1d66cbfc 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/NetworkUtils.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/NetworkUtils.java @@ -171,7 +171,9 @@ public static URI dropQuery(URI u) { public static java.net.http.HttpRequest.Builder newRequestBuilder(URI uri) { var builder = java.net.http.HttpRequest.newBuilder(uri); - var apiKey = API_KEYS.get(uri.getHost().toLowerCase(Locale.ROOT)); + var host = uri.getHost(); + if (host == null) return builder; + var apiKey = API_KEYS.get(host.toLowerCase(Locale.ROOT)); if (StringUtils.isNotBlank(apiKey)) builder.header("x-api-key", apiKey); return builder;