Skip to content

Commit 4f524ec

Browse files
committed
Add support for custom headers
1 parent 755b419 commit 4f524ec

File tree

3 files changed

+46
-0
lines changed

3 files changed

+46
-0
lines changed

sdk/src/main/java/com/amplitude/experiment/DefaultExperimentClient.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,12 +373,18 @@ internal class DefaultExperimentClient internal constructor(
373373
serverUrl.newBuilder()
374374
.addPathSegments("sdk/v2/vardata")
375375
.build()
376+
val customRequestHeaders = config.customRequestHeaders?.invoke(user)
376377
val builder =
377378
Request.Builder()
378379
.get()
379380
.url(url)
380381
.addHeader("Authorization", "Api-Key $apiKey")
381382
.addHeader("X-Amp-Exp-User", userBase64)
383+
.apply {
384+
customRequestHeaders?.forEach { (name, value) ->
385+
addHeader(name, value)
386+
}
387+
}
382388
if (!options?.flagKeys.isNullOrEmpty()) {
383389
val flagKeysBase64 =
384390
JSONArray(options?.flagKeys)

sdk/src/main/java/com/amplitude/experiment/ExperimentConfig.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ class ExperimentConfig internal constructor(
5858
val analyticsProvider: ExperimentAnalyticsProvider? = Defaults.ANALYTICS_PROVIDER,
5959
@JvmField
6060
val exposureTrackingProvider: ExposureTrackingProvider? = Defaults.EXPOSURE_TRACKING_PROVIDER,
61+
@JvmField
62+
val customRequestHeaders: ((ExperimentUser) -> Map<String, String>)? = Defaults.CUSTOM_REQUEST_HEADERS
6163
) {
6264
/**
6365
* Construct the default [ExperimentConfig].
@@ -163,6 +165,11 @@ class ExperimentConfig internal constructor(
163165
* null
164166
*/
165167
val EXPOSURE_TRACKING_PROVIDER: ExposureTrackingProvider? = null
168+
169+
/**
170+
* null
171+
*/
172+
val CUSTOM_REQUEST_HEADERS: ((ExperimentUser) -> Map<String, String>)? = null
166173
}
167174

168175
companion object {
@@ -192,6 +199,7 @@ class ExperimentConfig internal constructor(
192199
private var userProvider = Defaults.USER_PROVIDER
193200
private var analyticsProvider = Defaults.ANALYTICS_PROVIDER
194201
private var exposureTrackingProvider = Defaults.EXPOSURE_TRACKING_PROVIDER
202+
private var customRequestHeaders = Defaults.CUSTOM_REQUEST_HEADERS
195203

196204
fun debug(debug: Boolean) =
197205
apply {
@@ -289,6 +297,11 @@ class ExperimentConfig internal constructor(
289297
this.exposureTrackingProvider = exposureTrackingProvider
290298
}
291299

300+
fun customRequestHeaders(customRequestHeaders: ((ExperimentUser) -> Map<String, String>)?) =
301+
apply {
302+
this.customRequestHeaders = customRequestHeaders
303+
}
304+
292305
fun build(): ExperimentConfig {
293306
return ExperimentConfig(
294307
debug = debug,
@@ -335,5 +348,6 @@ class ExperimentConfig internal constructor(
335348
.userProvider(userProvider)
336349
.analyticsProvider(analyticsProvider)
337350
.exposureTrackingProvider(exposureTrackingProvider)
351+
.customRequestHeaders(customRequestHeaders)
338352
}
339353
}

sdk/src/test/java/com/amplitude/experiment/ExperimentClientTest.kt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1355,4 +1355,30 @@ class ExperimentClientTest {
13551355
)
13561356
Assert.assertEquals(900000, client.flagConfigPollingIntervalMillis)
13571357
}
1358+
1359+
@Test
1360+
fun `test config custom request headers added, http call includes headers`() {
1361+
val mockHttpClient = mockk<OkHttpClient>()
1362+
val testCountry = "South Africa"
1363+
val client =
1364+
DefaultExperimentClient(
1365+
API_KEY,
1366+
ExperimentConfig(
1367+
customRequestHeaders = { user ->
1368+
mapOf("country" to user.country!!)
1369+
}
1370+
),
1371+
mockHttpClient,
1372+
mockStorage,
1373+
Experiment.executorService,
1374+
)
1375+
1376+
client.fetch(ExperimentUser(country = testCountry))
1377+
1378+
verify {
1379+
mockHttpClient.newCall(match {
1380+
it.headers["country"] == testCountry
1381+
})
1382+
}
1383+
}
13581384
}

0 commit comments

Comments
 (0)