Skip to content

Commit a5ee092

Browse files
committed
fix(agent): algolia agent as query param (#391)
1 parent 402473e commit a5ee092

File tree

5 files changed

+49
-16
lines changed

5 files changed

+49
-16
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.algolia.search.configuration.internal.extension
2+
3+
import com.algolia.search.configuration.AlgoliaSearchClient
4+
import com.algolia.search.configuration.clientUserAgent
5+
import com.algolia.search.serialize.internal.Key
6+
import io.ktor.client.HttpClient
7+
import io.ktor.client.plugins.HttpClientPlugin
8+
import io.ktor.client.request.HttpRequestPipeline
9+
import io.ktor.util.AttributeKey
10+
11+
/**
12+
* A plugin that adds Algolia agent to all requests.
13+
*
14+
* @property agent `X-Algolia-Agent` header value.
15+
*/
16+
internal class AlgoliaAgent private constructor(val agent: String) {
17+
18+
class Config(var agent: String = clientUserAgent(AlgoliaSearchClient.version))
19+
20+
companion object Plugin : HttpClientPlugin<Config, AlgoliaAgent> {
21+
22+
override val key: AttributeKey<AlgoliaAgent> = AttributeKey("AlgoliaAgent")
23+
override fun prepare(block: Config.() -> Unit): AlgoliaAgent = AlgoliaAgent(Config().apply(block).agent)
24+
25+
override fun install(plugin: AlgoliaAgent, scope: HttpClient) {
26+
scope.requestPipeline.intercept(HttpRequestPipeline.State) {
27+
context.url.parameters.apply {
28+
val parameter = Key.AlgoliaAgent
29+
val current = getAll(parameter) ?: listOf()
30+
val updated = listOf(plugin.agent) + current
31+
remove(parameter)
32+
append(parameter, updated.joinToString("; "))
33+
}
34+
}
35+
}
36+
}
37+
}

client/src/commonMain/kotlin/com/algolia/search/configuration/internal/extension/HttpClient.kt

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
package com.algolia.search.configuration.internal.extension
22

3-
import com.algolia.search.configuration.AlgoliaSearchClient
43
import com.algolia.search.configuration.Configuration
5-
import com.algolia.search.configuration.clientUserAgent
64
import com.algolia.search.logging.LogLevel
75
import com.algolia.search.logging.Logger
86
import com.algolia.search.logging.internal.toKtorLogger
97
import com.algolia.search.serialize.internal.JsonNonStrict
108
import io.ktor.client.HttpClient
119
import io.ktor.client.HttpClientConfig
1210
import io.ktor.client.plugins.HttpTimeout
13-
import io.ktor.client.plugins.UserAgent
1411
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
1512
import io.ktor.client.plugins.defaultRequest
1613
import io.ktor.client.plugins.logging.Logging
@@ -31,10 +28,8 @@ internal fun HttpClientConfig<*>.configure(configuration: Configuration) {
3128
// Logging
3229
installLogging(configuration.logLevel, configuration.logger)
3330

34-
// User agent
35-
install(UserAgent) {
36-
agent = clientUserAgent(AlgoliaSearchClient.version)
37-
}
31+
// Algolia user agent
32+
install(AlgoliaAgent)
3833

3934
// Timeout
4035
install(HttpTimeout)

client/src/commonMain/kotlin/com/algolia/search/endpoint/internal/EndpointInsights.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ internal class EndpointInsightsImpl(
1818
) : EndpointInsights {
1919

2020
override suspend fun sendEvent(event: InsightsEvent, requestOptions: RequestOptions?): HttpResponse {
21-
return sendEvents(listOf(event))
21+
return sendEvents(listOf(event), requestOptions)
2222
}
2323

2424
override suspend fun sendEvents(events: List<InsightsEvent>, requestOptions: RequestOptions?): HttpResponse {

client/src/commonMain/kotlin/com/algolia/search/serialize/internal/Key.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,4 +433,5 @@ internal object Key {
433433
const val MaxRecommendations: String = "maxRecommendations"
434434
const val FallbackParameters: String = "fallbackParameters"
435435
const val Default: String = "default"
436+
const val AlgoliaAgent = "X-Algolia-Agent"
436437
}

client/src/commonTest/kotlin/configuration/TestUserAgent.kt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ import com.algolia.search.client.ClientSearch
44
import com.algolia.search.configuration.AlgoliaSearchClient
55
import com.algolia.search.configuration.ConfigurationSearch
66
import com.algolia.search.configuration.clientUserAgent
7-
import com.algolia.search.internal.BuildConfig
7+
import com.algolia.search.configuration.internal.extension.AlgoliaAgent
88
import com.algolia.search.model.APIKey
99
import com.algolia.search.model.ApplicationID
10+
import com.algolia.search.serialize.internal.Key
1011
import io.ktor.client.engine.mock.MockEngine
1112
import io.ktor.client.engine.mock.respondOk
12-
import io.ktor.client.plugins.UserAgent
1313
import io.ktor.client.request.HttpRequestBuilder
1414
import io.ktor.client.request.request
1515
import kotlinx.coroutines.test.runTest
@@ -21,7 +21,6 @@ internal class TestUserAgent {
2121

2222
private val applicationID = ApplicationID("applicationID")
2323
private val apiKey = APIKey("apiKey")
24-
private val userAgentKey = "User-Agent"
2524

2625
@Test
2726
fun testUserAgent() {
@@ -33,22 +32,23 @@ internal class TestUserAgent {
3332
@Test
3433
fun overridingUserAgentInConfigurationShouldBeIgnored() {
3534
runTest {
35+
val testAgent = "Test"
3636
val configuration = ConfigurationSearch(
3737
applicationID = applicationID,
3838
engine = MockEngine { respondOk() },
3939
apiKey = apiKey,
4040
httpClientConfig = {
41-
install(UserAgent) {
42-
agent = "Test"
41+
install(AlgoliaAgent) {
42+
agent = testAgent
4343
}
4444
}
4545
)
4646
val client = ClientSearch(configuration)
4747
val request = client.httpClient.request(HttpRequestBuilder())
48-
val headers = request.call.request.headers
48+
val urlParameters = request.call.request.url.parameters
4949

50-
headers.contains(userAgentKey).shouldBeTrue()
51-
headers[userAgentKey] shouldEqual clientUserAgent(BuildConfig.version)
50+
urlParameters.contains(Key.AlgoliaAgent).shouldBeTrue()
51+
urlParameters[Key.AlgoliaAgent] shouldEqual testAgent
5252
}
5353
}
5454
}

0 commit comments

Comments
 (0)