From 26b0e8b31b36110281850684c9e199fb49ed2e4e Mon Sep 17 00:00:00 2001 From: Arjan Schrijver Date: Mon, 19 Jan 2026 14:27:10 +0100 Subject: [PATCH] Send User-Agent header with internet requests --- .../gadgetbridge/util/InternetUtils.kt | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/InternetUtils.kt b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/InternetUtils.kt index 339899d7d0..554ad05f94 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/InternetUtils.kt +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/InternetUtils.kt @@ -18,6 +18,7 @@ package nodomain.freeyourgadget.gadgetbridge.util import android.net.Uri import android.webkit.WebResourceResponse +import nodomain.freeyourgadget.gadgetbridge.BuildConfig import nodomain.freeyourgadget.gadgetbridge.GBApplication import nodomain.freeyourgadget.internethelper.aidl.http.HttpRequest import okhttp3.Headers @@ -43,6 +44,23 @@ class InternetUtils { companion object { private val LOG: Logger = LoggerFactory.getLogger(InternetUtils::class.java) private val defaultClient = OkHttpClient() + private const val USER_AGENT = "Gadgetbridge/${BuildConfig.VERSION_NAME} (${BuildConfig.GIT_HASH_SHORT})" + + /** + * Returns a new Map containing the User-Agent header. + * If the provided Map already contains a User-Agent, it is kept intact. + */ + fun headersWithUserAgent( + requestHeaders: Map + ): Map { + val hasUserAgent = requestHeaders.keys.any { it.equals("User-Agent", ignoreCase = true) } + + return if (hasUserAgent) { + requestHeaders + } else { + requestHeaders + ("User-Agent" to USER_AGENT) + } + } /** * Performs an HTTP request to the given URI, optionally allowing insecure connections. @@ -61,7 +79,7 @@ class InternetUtils { InternetHelperSingleton.send( uri, HttpRequest.Method.valueOf(method), - requestHeaders, + headersWithUserAgent(requestHeaders), body, bodyContentType, allowInsecure, @@ -84,7 +102,7 @@ class InternetUtils { val text = doStringRequest( uri, method, - requestHeaders, + headersWithUserAgent(requestHeaders), body, bodyContentType, allowInsecure @@ -107,7 +125,7 @@ class InternetUtils { directRequest( uri = uri, method = "GET", - requestHeaders = emptyMap(), + requestHeaders = mapOf("User-Agent" to USER_AGENT), body = null, bodyContentType = "application/octet-stream", allowInsecure = false @@ -116,7 +134,7 @@ class InternetUtils { InternetHelperSingleton.send( uri, HttpRequest.Method.GET, - requestHeaders = emptyMap(), + requestHeaders = mapOf("User-Agent" to USER_AGENT), null, "application/octet-stream", false @@ -153,7 +171,7 @@ class InternetUtils { val builder = Request.Builder().url(uri.toString()) // Apply request headers - for ((key, value) in requestHeaders) { + for ((key, value) in headersWithUserAgent(requestHeaders)) { builder.addHeader(key, value) }