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..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 @@ -47,20 +47,21 @@ 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 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/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..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 @@ -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; @@ -163,6 +164,21 @@ public static URI dropQuery(URI u) { } } + 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) { + var builder = java.net.http.HttpRequest.newBuilder(uri); + 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; + } + public static URLConnection createConnection(WebURL url) throws IOException { URLConnection connection; try {