From bb20962339b63fd3f4f5d55daadd3bc9a7de83bd Mon Sep 17 00:00:00 2001 From: movte Date: Wed, 8 Jul 2026 12:32:56 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=B8=8B=E8=BD=BD=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E5=A7=8B=E7=BB=88=E6=A0=87=E6=B3=A8=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E5=99=A8UA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../game/account/AccountUtils.kt | 2 ++ .../account/wardrobe/WardrobeDownloader.kt | 6 ++---- .../movtery/zalithlauncher/path/UrlManager.kt | 20 +++++++++++++++++++ .../utils/network/NetWorkUtils.kt | 7 +------ 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/ZalithLauncher/src/main/java/com/movtery/zalithlauncher/game/account/AccountUtils.kt b/ZalithLauncher/src/main/java/com/movtery/zalithlauncher/game/account/AccountUtils.kt index 8454ca7c2..db34ca198 100644 --- a/ZalithLauncher/src/main/java/com/movtery/zalithlauncher/game/account/AccountUtils.kt +++ b/ZalithLauncher/src/main/java/com/movtery/zalithlauncher/game/account/AccountUtils.kt @@ -39,6 +39,7 @@ import com.movtery.zalithlauncher.game.account.microsoft.getTokenResponse import com.movtery.zalithlauncher.game.account.microsoft.microsoftAuthAsync import com.movtery.zalithlauncher.game.account.microsoft.toLocal import com.movtery.zalithlauncher.ui.screens.content.elements.MicrosoftLoginOperation +import com.movtery.zalithlauncher.path.URL_USER_AGENT import com.movtery.zalithlauncher.utils.copyText import com.movtery.zalithlauncher.utils.logging.Logger import com.movtery.zalithlauncher.utils.network.toLocal @@ -385,6 +386,7 @@ fun tryGetFullServerUrl(baseUrl: String): String { (URL(url).openConnection() as HttpURLConnection).apply { connectTimeout = 5000 readTimeout = 5000 + setRequestProperty("User-Agent", URL_USER_AGENT) } var conn: HttpURLConnection? = null diff --git a/ZalithLauncher/src/main/java/com/movtery/zalithlauncher/game/account/wardrobe/WardrobeDownloader.kt b/ZalithLauncher/src/main/java/com/movtery/zalithlauncher/game/account/wardrobe/WardrobeDownloader.kt index 80dc6f6e4..38542dc1b 100644 --- a/ZalithLauncher/src/main/java/com/movtery/zalithlauncher/game/account/wardrobe/WardrobeDownloader.kt +++ b/ZalithLauncher/src/main/java/com/movtery/zalithlauncher/game/account/wardrobe/WardrobeDownloader.kt @@ -20,11 +20,11 @@ package com.movtery.zalithlauncher.game.account.wardrobe import com.google.gson.JsonObject import com.movtery.zalithlauncher.path.createOkHttpClient +import com.movtery.zalithlauncher.path.createRequestBuilder import com.movtery.zalithlauncher.utils.GSON import com.movtery.zalithlauncher.utils.logging.Logger import com.movtery.zalithlauncher.utils.network.fetchStringFromUrl import com.movtery.zalithlauncher.utils.string.decodeBase64 -import okhttp3.Request import java.io.File import java.io.FileOutputStream @@ -52,9 +52,7 @@ abstract class WardrobeDownloader { if (!exists()) mkdirs() } - val request = Request.Builder() - .url(url) - .build() + val request = createRequestBuilder(url).build() mClient.newCall(request).execute().use { response -> if (!response.isSuccessful) { diff --git a/ZalithLauncher/src/main/java/com/movtery/zalithlauncher/path/UrlManager.kt b/ZalithLauncher/src/main/java/com/movtery/zalithlauncher/path/UrlManager.kt index 56d6db957..fd9879177 100644 --- a/ZalithLauncher/src/main/java/com/movtery/zalithlauncher/path/UrlManager.kt +++ b/ZalithLauncher/src/main/java/com/movtery/zalithlauncher/path/UrlManager.kt @@ -114,6 +114,24 @@ private val CURSEFORGE_INTERCEPTOR = Interceptor { chain -> chain.proceed(request) } +/** + * An [Interceptor] that ensures the [URL_USER_AGENT] header is present on every request. + * + * If a request already carries a User-Agent header (set by [createRequestBuilder] or + * similar), this interceptor is a no-op — avoiding duplicate headers. + */ +private val USER_AGENT_INTERCEPTOR = Interceptor { chain -> + val request = chain.request() + if (request.header("User-Agent") != null) { + chain.proceed(request) + } else { + val newRequest = request.newBuilder() + .header("User-Agent", URL_USER_AGENT) + .build() + chain.proceed(newRequest) + } +} + fun createRequestBuilder(url: String): Request.Builder { return createRequestBuilder(url, null) } @@ -133,6 +151,7 @@ fun createOkHttpClientBuilder(action: (OkHttpClient.Builder) -> Unit = { }): OkH return OkHttpClient.Builder() .callTimeout(TIME_OUT, TimeUnit.MILLISECONDS) .addInterceptor(CURSEFORGE_INTERCEPTOR) + .addInterceptor(USER_AGENT_INTERCEPTOR) .apply(action) } @@ -152,6 +171,7 @@ val DOWNLOAD_OKHTTP_CLIENT: OkHttpClient by lazy { .writeTimeout(30, TimeUnit.SECONDS) .retryOnConnectionFailure(true) .addInterceptor(CURSEFORGE_INTERCEPTOR) + .addInterceptor(USER_AGENT_INTERCEPTOR) .build() // 注意:不设置 callTimeout,因为文件大小差异极大 // 协程层的 withTimeout 提供整体兜底保护 diff --git a/ZalithLauncher/src/main/java/com/movtery/zalithlauncher/utils/network/NetWorkUtils.kt b/ZalithLauncher/src/main/java/com/movtery/zalithlauncher/utils/network/NetWorkUtils.kt index 7a079d378..00ba95489 100644 --- a/ZalithLauncher/src/main/java/com/movtery/zalithlauncher/utils/network/NetWorkUtils.kt +++ b/ZalithLauncher/src/main/java/com/movtery/zalithlauncher/utils/network/NetWorkUtils.kt @@ -28,7 +28,6 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.movtery.zalithlauncher.R import com.movtery.zalithlauncher.context.COPY_LABEL_LINK import com.movtery.zalithlauncher.path.DOWNLOAD_OKHTTP_CLIENT -import com.movtery.zalithlauncher.path.URL_USER_AGENT import com.movtery.zalithlauncher.path.createOkHttpClient import com.movtery.zalithlauncher.path.createRequestBuilder import com.movtery.zalithlauncher.ui.theme.showThemed @@ -50,7 +49,6 @@ import kotlinx.coroutines.runInterruptible import kotlinx.coroutines.withContext import kotlinx.coroutines.withTimeout import okhttp3.Call -import okhttp3.Request import org.apache.commons.io.FileUtils import java.io.BufferedOutputStream import java.io.File @@ -120,10 +118,7 @@ fun downloadFileWithHttp( try { outputFile.ensureParentDirectory() - val request = Request.Builder() - .url(url) - .header("User-Agent", URL_USER_AGENT) - .build() + val request = createRequestBuilder(url).build() DOWNLOAD_OKHTTP_CLIENT .newCall(request)