Skip to content

Commit a819870

Browse files
committed
fix: support for downloading the CLI when proxy is configured
Until this commit, the CLI download manager relied on a separately configured HTTP client that lacked proxy support, unlike the REST client which was refactored and modularized. Now we have the same support for proxy and a proper user agent and custom logging interceptor.
1 parent ec51cb4 commit a819870

File tree

4 files changed

+37
-19
lines changed

4 files changed

+37
-19
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66

77
- workspaces status is now refresh every time Coder Toolbox becomes visible
88

9+
### Fixed
10+
11+
- support for downloading the CLI when proxy is configured
12+
913
## 0.6.2 - 2025-08-14
1014

1115
### Changed

src/main/kotlin/com/coder/toolbox/cli/CoderCLIManager.kt

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@ import com.coder.toolbox.cli.gpg.GPGVerifier
1212
import com.coder.toolbox.cli.gpg.VerificationResult
1313
import com.coder.toolbox.cli.gpg.VerificationResult.Failed
1414
import com.coder.toolbox.cli.gpg.VerificationResult.Invalid
15+
import com.coder.toolbox.plugin.PluginManager
16+
import com.coder.toolbox.sdk.CoderHttpClientBuilder
17+
import com.coder.toolbox.sdk.interceptors.Interceptors
1518
import com.coder.toolbox.sdk.v2.models.Workspace
1619
import com.coder.toolbox.sdk.v2.models.WorkspaceAgent
1720
import com.coder.toolbox.settings.SignatureFallbackStrategy.ALLOW
18-
import com.coder.toolbox.util.CoderHostnameVerifier
1921
import com.coder.toolbox.util.InvalidVersionException
2022
import com.coder.toolbox.util.SemVer
21-
import com.coder.toolbox.util.coderSocketFactory
22-
import com.coder.toolbox.util.coderTrustManagers
2323
import com.coder.toolbox.util.escape
2424
import com.coder.toolbox.util.escapeSubcommand
2525
import com.coder.toolbox.util.safeHost
@@ -29,15 +29,13 @@ import com.squareup.moshi.JsonDataException
2929
import com.squareup.moshi.Moshi
3030
import kotlinx.coroutines.Dispatchers
3131
import kotlinx.coroutines.withContext
32-
import okhttp3.OkHttpClient
3332
import org.zeroturnaround.exec.ProcessExecutor
3433
import retrofit2.Retrofit
3534
import java.io.EOFException
3635
import java.io.FileNotFoundException
3736
import java.net.URL
3837
import java.nio.file.Files
3938
import java.nio.file.Path
40-
import javax.net.ssl.X509TrustManager
4139

4240
/**
4341
* Version output from the CLI's version command.
@@ -148,13 +146,14 @@ class CoderCLIManager(
148146
val coderConfigPath: Path = context.settingsStore.dataDir(deploymentURL).resolve("config")
149147

150148
private fun createDownloadService(): CoderDownloadService {
151-
val okHttpClient = OkHttpClient.Builder()
152-
.sslSocketFactory(
153-
coderSocketFactory(context.settingsStore.tls),
154-
coderTrustManagers(context.settingsStore.tls.caPath)[0] as X509TrustManager
155-
)
156-
.hostnameVerifier(CoderHostnameVerifier(context.settingsStore.tls.altHostname))
157-
.build()
149+
val interceptors = buildList {
150+
add((Interceptors.userAgent(PluginManager.pluginInfo.version)))
151+
add(Interceptors.logging(context))
152+
}
153+
val okHttpClient = CoderHttpClientBuilder.build(
154+
context,
155+
interceptors
156+
)
158157

159158
val retrofit = Retrofit.Builder()
160159
.baseUrl(deploymentURL.toString())

src/test/kotlin/com/coder/toolbox/cli/CoderCLIManagerTest.kt

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import com.jetbrains.toolbox.api.core.diagnostics.Logger
3535
import com.jetbrains.toolbox.api.core.os.LocalDesktopManager
3636
import com.jetbrains.toolbox.api.localization.LocalizableStringFactory
3737
import com.jetbrains.toolbox.api.remoteDev.connection.ClientHelper
38+
import com.jetbrains.toolbox.api.remoteDev.connection.ProxyAuth
3839
import com.jetbrains.toolbox.api.remoteDev.connection.RemoteToolsHelper
3940
import com.jetbrains.toolbox.api.remoteDev.connection.ToolboxProxySettings
4041
import com.jetbrains.toolbox.api.remoteDev.states.EnvironmentStateColorPalette
@@ -52,6 +53,8 @@ import org.zeroturnaround.exec.InvalidExitValueException
5253
import org.zeroturnaround.exec.ProcessInitException
5354
import java.net.HttpURLConnection
5455
import java.net.InetSocketAddress
56+
import java.net.Proxy
57+
import java.net.ProxySelector
5558
import java.net.URI
5659
import java.net.URL
5760
import java.nio.file.AccessDeniedException
@@ -87,8 +90,17 @@ internal class CoderCLIManagerTest {
8790
mockk<Logger>(relaxed = true)
8891
),
8992
mockk<CoderSecretsStore>(),
90-
mockk<ToolboxProxySettings>()
91-
)
93+
object : ToolboxProxySettings {
94+
override fun getProxy(): Proxy? = null
95+
override fun getProxySelector(): ProxySelector? = null
96+
override fun getProxyAuth(): ProxyAuth? = null
97+
98+
override fun addProxyChangeListener(listener: Runnable) {
99+
}
100+
101+
override fun removeProxyChangeListener(listener: Runnable) {
102+
}
103+
})
92104

93105
@BeforeTest
94106
fun setup() {
@@ -547,11 +559,10 @@ internal class CoderCLIManagerTest {
547559
context.logger,
548560
)
549561

550-
val ccm =
551-
CoderCLIManager(
552-
context.copy(settingsStore = settings),
553-
it.url ?: URI.create("https://test.coder.invalid").toURL()
554-
)
562+
val ccm = CoderCLIManager(
563+
context.copy(settingsStore = settings),
564+
it.url ?: URI.create("https://test.coder.invalid").toURL()
565+
)
555566

556567
val sshConfigPath = Path.of(settings.sshConfigPath)
557568
// Input is the configuration that we start with, if any.

src/test/resources/extension.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"id": "com.coder.toolbox",
3+
"version": "development"
4+
}

0 commit comments

Comments
 (0)