Skip to content

Commit 1a460aa

Browse files
committed
impl: extract http client interceptors logic into a reusable utility
The objective is to be able to reuse the interceptors from multiple places.
1 parent 5d3eef3 commit 1a460aa

File tree

2 files changed

+69
-28
lines changed

2 files changed

+69
-28
lines changed

src/main/kotlin/com/coder/toolbox/sdk/CoderHttpClientBuilder.kt

Lines changed: 5 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
package com.coder.toolbox.sdk
22

33
import com.coder.toolbox.CoderToolboxContext
4-
import com.coder.toolbox.sdk.interceptors.LoggingInterceptor
4+
import com.coder.toolbox.sdk.interceptors.Interceptors
55
import com.coder.toolbox.util.CoderHostnameVerifier
66
import com.coder.toolbox.util.coderSocketFactory
77
import com.coder.toolbox.util.coderTrustManagers
8-
import com.coder.toolbox.util.getArch
9-
import com.coder.toolbox.util.getHeaders
10-
import com.coder.toolbox.util.getOS
118
import com.jetbrains.toolbox.api.remoteDev.connection.ProxyAuth
129
import okhttp3.Credentials
1310
import okhttp3.OkHttpClient
@@ -53,36 +50,16 @@ object CoderHttpClientBuilder {
5350
if (token.isNullOrBlank()) {
5451
throw IllegalStateException("Token is required for $url deployment")
5552
}
56-
builder = builder.addInterceptor {
57-
it.proceed(
58-
it.request().newBuilder().addHeader("Coder-Session-Token", token).build()
59-
)
60-
}
53+
builder = builder.addInterceptor(Interceptors.tokenAuth(token))
6154
}
6255

6356
return builder
6457
.sslSocketFactory(socketFactory, trustManagers[0] as X509TrustManager)
6558
.hostnameVerifier(CoderHostnameVerifier(settings.tls.altHostname))
6659
.retryOnConnectionFailure(true)
67-
.addInterceptor {
68-
it.proceed(
69-
it.request().newBuilder().addHeader(
70-
"User-Agent",
71-
"Coder Toolbox/$pluginVersion (${getOS()}; ${getArch()})",
72-
).build(),
73-
)
74-
}
75-
.addInterceptor {
76-
var request = it.request()
77-
val headers = getHeaders(url, settings.headerCommand)
78-
if (headers.isNotEmpty()) {
79-
val reqBuilder = request.newBuilder()
80-
headers.forEach { h -> reqBuilder.addHeader(h.key, h.value) }
81-
request = reqBuilder.build()
82-
}
83-
it.proceed(request)
84-
}
85-
.addInterceptor(LoggingInterceptor(context))
60+
.addInterceptor(Interceptors.userAgent(pluginVersion))
61+
.addInterceptor(Interceptors.externalHeaders(context, url))
62+
.addInterceptor(Interceptors.logging(context))
8663
.build()
8764
}
8865
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.coder.toolbox.sdk.interceptors
2+
3+
import com.coder.toolbox.CoderToolboxContext
4+
import com.coder.toolbox.util.getArch
5+
import com.coder.toolbox.util.getHeaders
6+
import com.coder.toolbox.util.getOS
7+
import okhttp3.Interceptor
8+
import java.net.URL
9+
10+
/**
11+
* Factory of okhttp interceptors
12+
*/
13+
object Interceptors {
14+
15+
/**
16+
* Creates a token authentication interceptor
17+
*/
18+
fun tokenAuth(token: String): Interceptor {
19+
return Interceptor { chain ->
20+
chain.proceed(
21+
chain.request().newBuilder()
22+
.addHeader("Coder-Session-Token", token)
23+
.build()
24+
)
25+
}
26+
}
27+
28+
/**
29+
* Creates a User-Agent header interceptor
30+
*/
31+
fun userAgent(pluginVersion: String): Interceptor {
32+
return Interceptor { chain ->
33+
chain.proceed(
34+
chain.request().newBuilder()
35+
.addHeader("User-Agent", "Coder Toolbox/$pluginVersion (${getOS()}; ${getArch()})")
36+
.build()
37+
)
38+
}
39+
}
40+
41+
/**
42+
* Adds headers generated by executing a native command
43+
*/
44+
fun externalHeaders(context: CoderToolboxContext, url: URL): Interceptor {
45+
val settings = context.settingsStore.readOnly()
46+
return Interceptor { chain ->
47+
var request = chain.request()
48+
val headers = getHeaders(url, settings.headerCommand)
49+
if (headers.isNotEmpty()) {
50+
val reqBuilder = request.newBuilder()
51+
headers.forEach { h -> reqBuilder.addHeader(h.key, h.value) }
52+
request = reqBuilder.build()
53+
}
54+
chain.proceed(request)
55+
}
56+
}
57+
58+
/**
59+
* Creates a logging interceptor
60+
*/
61+
fun logging(context: CoderToolboxContext): Interceptor {
62+
return LoggingInterceptor(context)
63+
}
64+
}

0 commit comments

Comments
 (0)