From 2c969c1744593bfc32575158aaddac3d6f40be65 Mon Sep 17 00:00:00 2001 From: Evandro Myller Date: Tue, 14 Apr 2026 18:21:30 -0300 Subject: [PATCH 1/2] Send SDK name and version to the Flagsmith API on every request Co-Authored-By: Claude Opus 4.6 (1M context) --- .../internal/FlagsmithEventService.kt | 1 + .../internal/FlagsmithRetrofitService.kt | 15 +++++ .../test/java/com/flagsmith/UserAgentTests.kt | 55 +++++++++++++++++++ 3 files changed, 71 insertions(+) create mode 100644 FlagsmithClient/src/test/java/com/flagsmith/UserAgentTests.kt diff --git a/FlagsmithClient/src/main/java/com/flagsmith/internal/FlagsmithEventService.kt b/FlagsmithClient/src/main/java/com/flagsmith/internal/FlagsmithEventService.kt index e10888d..b37254c 100644 --- a/FlagsmithClient/src/main/java/com/flagsmith/internal/FlagsmithEventService.kt +++ b/FlagsmithClient/src/main/java/com/flagsmith/internal/FlagsmithEventService.kt @@ -19,6 +19,7 @@ internal class FlagsmithEventService constructor( ) { private val sseClient = OkHttpClient.Builder() .addInterceptor(FlagsmithRetrofitService.envKeyInterceptor(environmentKey)) + .addInterceptor(FlagsmithRetrofitService.userAgentInterceptor()) .connectTimeout(6, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.MINUTES) .writeTimeout(10, TimeUnit.MINUTES) diff --git a/FlagsmithClient/src/main/java/com/flagsmith/internal/FlagsmithRetrofitService.kt b/FlagsmithClient/src/main/java/com/flagsmith/internal/FlagsmithRetrofitService.kt index 60e9eab..dea651e 100644 --- a/FlagsmithClient/src/main/java/com/flagsmith/internal/FlagsmithRetrofitService.kt +++ b/FlagsmithClient/src/main/java/com/flagsmith/internal/FlagsmithRetrofitService.kt @@ -39,6 +39,20 @@ interface FlagsmithRetrofitService { private const val UPDATED_AT_HEADER = "x-flagsmith-document-updated-at" private const val ACCEPT_HEADER_VALUE = "application/json" private const val CONTENT_TYPE_HEADER_VALUE = "application/json; charset=utf-8" + private const val USER_AGENT_HEADER = "User-Agent" + + // x-release-please-start-version + private const val SDK_VERSION = "1.8.0" + // x-release-please-end + + fun userAgentInterceptor(): Interceptor { + return Interceptor { chain -> + val request = chain.request().newBuilder() + .header(USER_AGENT_HEADER, "flagsmith-kotlin-android-sdk/$SDK_VERSION") + .build() + chain.proceed(request) + } + } fun create( baseUrl: String, @@ -92,6 +106,7 @@ interface FlagsmithRetrofitService { val client = OkHttpClient.Builder() .addInterceptor(envKeyInterceptor(environmentKey)) + .addInterceptor(userAgentInterceptor()) .addInterceptor(updatedAtInterceptor(timeTracker)) .addInterceptor(jsonContentTypeInterceptor()) .let { if (cacheConfig.enableCache) it.addNetworkInterceptor(cacheControlInterceptor()) else it } diff --git a/FlagsmithClient/src/test/java/com/flagsmith/UserAgentTests.kt b/FlagsmithClient/src/test/java/com/flagsmith/UserAgentTests.kt new file mode 100644 index 0000000..bf2da41 --- /dev/null +++ b/FlagsmithClient/src/test/java/com/flagsmith/UserAgentTests.kt @@ -0,0 +1,55 @@ +package com.flagsmith + +import com.flagsmith.mockResponses.MockEndpoint +import com.flagsmith.mockResponses.mockResponseFor +import kotlinx.coroutines.runBlocking +import org.junit.After +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.mockserver.integration.ClientAndServer +import org.mockserver.model.HttpRequest.request + +class UserAgentTests { + + private lateinit var mockServer: ClientAndServer + private lateinit var flagsmith: Flagsmith + + @Before + fun setup() { + mockServer = ClientAndServer.startClientAndServer() + flagsmith = Flagsmith( + environmentKey = "", + baseUrl = "http://localhost:${mockServer.localPort}", + enableAnalytics = false, + cacheConfig = FlagsmithCacheConfig(enableCache = false) + ) + } + + @After + fun tearDown() { + mockServer.stop() + } + + @Test + fun testUserAgentHeaderIsSent() { + mockServer.mockResponseFor(MockEndpoint.GET_FLAGS) + runBlocking { + val result = flagsmith.getFeatureFlagsSync() + assertTrue(result.isSuccess) + } + + val requests = mockServer.retrieveRecordedRequests( + request() + .withPath("/flags/") + .withMethod("GET") + ) + assertEquals(1, requests.size) + + val userAgent = requests[0].getFirstHeader("User-Agent") + // x-release-please-start-version + assertEquals("flagsmith-kotlin-android-sdk/1.8.0", userAgent) + // x-release-please-end + } +} From b5c247418a28530278e3661bf521c68cbb7e001e Mon Sep 17 00:00:00 2001 From: Evandro Myller Date: Tue, 14 Apr 2026 18:21:59 -0300 Subject: [PATCH 2/2] Keep the reported SDK version current after each release Co-Authored-By: Claude Opus 4.6 (1M context) --- release-please-config.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/release-please-config.json b/release-please-config.json index 81d97a3..20d01ad 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -8,7 +8,11 @@ "bump-patch-for-minor-pre-major": false, "draft": false, "prerelease": false, - "include-component-in-tag": false + "include-component-in-tag": false, + "extra-files": [ + "FlagsmithClient/src/main/java/com/flagsmith/internal/FlagsmithRetrofitService.kt", + "FlagsmithClient/src/test/java/com/flagsmith/UserAgentTests.kt" + ] } }, "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json",