From 19ad248cfe7f1c8481dad469e0bb214d7d0b7cbd Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Tue, 5 May 2026 10:40:09 +0800 Subject: [PATCH] Apply Basic auth from URL userinfo https://github.com/2dust/v2rayNG/issues/5583 --- .../main/java/com/v2ray/ang/util/HttpUtil.kt | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/util/HttpUtil.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/util/HttpUtil.kt index 74bc051e..42659d23 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/util/HttpUtil.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/util/HttpUtil.kt @@ -172,6 +172,9 @@ object HttpUtil { .get() .header("User-agent", finalUserAgent) .header("Connection", "close") + + applyEmbeddedBasicAuthHeader(currentUrl, requestBuilder) + if (httpPort != 0 && !proxyUsername.isNullOrBlank() && !proxyPassword.isNullOrBlank()) { requestBuilder.header("Proxy-Authorization", Credentials.basic(proxyUsername, proxyPassword)) } @@ -203,6 +206,20 @@ object HttpUtil { throw IOException("Too many redirects") } + private fun applyEmbeddedBasicAuthHeader(rawUrl: String, requestBuilder: Request.Builder) { + val parsed = runCatching { URL(rawUrl) }.getOrNull() ?: return + parsed.userInfo?.let { userInfo -> + val colon = userInfo.indexOf(':') + val user = runCatching { + Utils.decodeURIComponent(if (colon >= 0) userInfo.substring(0, colon) else userInfo) + }.getOrDefault(if (colon >= 0) userInfo.substring(0, colon) else userInfo) + val pass = runCatching { + Utils.decodeURIComponent(if (colon >= 0) userInfo.substring(colon + 1) else "") + }.getOrDefault(if (colon >= 0) userInfo.substring(colon + 1) else "") + requestBuilder.header("Authorization", Credentials.basic(user, pass)) + } + } + private fun buildOkHttpClient( timeout: Int, httpPort: Int, @@ -290,4 +307,3 @@ object HttpUtil { } } } -