From d0ee5fa4bb47c2cd5f6541d3bfc3413688413ba6 Mon Sep 17 00:00:00 2001 From: Frank Olbricht Date: Mon, 17 Aug 2026 21:18:58 +0000 Subject: [PATCH 1/2] impl: fall back to CODER_HEADER_COMMAND when the header command setting is blank --- CHANGELOG.md | 4 +++ README.md | 3 ++- .../toolbox/settings/ReadOnlyCoderSettings.kt | 4 ++- .../coder/toolbox/store/CoderSettingsStore.kt | 4 ++- .../com/coder/toolbox/store/StoreKeys.kt | 2 ++ .../toolbox/settings/CoderSettingsTest.kt | 25 +++++++++++++++++++ 6 files changed, 39 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e1e0a06..878a807a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +### Added + +- the header command falls back to the `CODER_HEADER_COMMAND` environment variable when the setting is blank, matching the Coder CLI and the VS Code extension + ## 0.9.3 - 2026-08-11 ### Changed diff --git a/README.md b/README.md index 32b3a159..e207d438 100644 --- a/README.md +++ b/README.md @@ -509,7 +509,8 @@ explicit entry per resolved workspace/agent using expansion. - `Header command` command that outputs additional HTTP headers. Each line of output must be in the format key=value. - The environment variable CODER_URL will be available to the command process. + The environment variable CODER_URL will be available to the command process. If left blank, the + `CODER_HEADER_COMMAND` environment variable is used, if set. - `lastDeploymentURL` the last Coder deployment URL that Coder Toolbox successfully authenticated to. diff --git a/src/main/kotlin/com/coder/toolbox/settings/ReadOnlyCoderSettings.kt b/src/main/kotlin/com/coder/toolbox/settings/ReadOnlyCoderSettings.kt index 04576d50..9aff5c50 100644 --- a/src/main/kotlin/com/coder/toolbox/settings/ReadOnlyCoderSettings.kt +++ b/src/main/kotlin/com/coder/toolbox/settings/ReadOnlyCoderSettings.kt @@ -94,7 +94,9 @@ interface ReadOnlyCoderSettings { * An external command that outputs additional HTTP headers added to all * requests. The command must output each header as `key=value` on its own * line. The following environment variables will be available to the - * process: CODER_URL. + * process: CODER_URL. Falls back to the CODER_HEADER_COMMAND environment + * variable (the same variable the Coder CLI reads) when the setting is + * blank. */ val headerCommand: String? diff --git a/src/main/kotlin/com/coder/toolbox/store/CoderSettingsStore.kt b/src/main/kotlin/com/coder/toolbox/store/CoderSettingsStore.kt index 14cc9f63..ea217a93 100644 --- a/src/main/kotlin/com/coder/toolbox/store/CoderSettingsStore.kt +++ b/src/main/kotlin/com/coder/toolbox/store/CoderSettingsStore.kt @@ -54,7 +54,9 @@ class CoderSettingsStore( override val globalDataDirectory: String get() = getDefaultGlobalDataDir().normalize().toString() override val globalConfigDir: String get() = getDefaultGlobalConfigDir().normalize().toString() override val enableDownloads: Boolean get() = store[ENABLE_DOWNLOADS]?.toBooleanStrictOrNull() ?: true - override val headerCommand: String? get() = store[HEADER_COMMAND] + override val headerCommand: String? + get() = store[HEADER_COMMAND].takeUnless { it.isNullOrEmpty() } + ?: env.get(CODER_HEADER_COMMAND).takeUnless { it.isEmpty() } override val tls: ReadOnlyTLSSettings get() = TLSSettings( certPath = store[TLS_CERT_PATH], diff --git a/src/main/kotlin/com/coder/toolbox/store/StoreKeys.kt b/src/main/kotlin/com/coder/toolbox/store/StoreKeys.kt index 69fea407..2a95b347 100644 --- a/src/main/kotlin/com/coder/toolbox/store/StoreKeys.kt +++ b/src/main/kotlin/com/coder/toolbox/store/StoreKeys.kt @@ -2,6 +2,8 @@ package com.coder.toolbox.store internal const val CODER_SSH_CONFIG_OPTIONS = "CODER_SSH_CONFIG_OPTIONS" +internal const val CODER_HEADER_COMMAND = "CODER_HEADER_COMMAND" + internal const val LAST_USED_URL = "lastDeploymentURL" internal const val DEFAULT_URL = "defaultURL" diff --git a/src/test/kotlin/com/coder/toolbox/settings/CoderSettingsTest.kt b/src/test/kotlin/com/coder/toolbox/settings/CoderSettingsTest.kt index 69056834..c78473da 100644 --- a/src/test/kotlin/com/coder/toolbox/settings/CoderSettingsTest.kt +++ b/src/test/kotlin/com/coder/toolbox/settings/CoderSettingsTest.kt @@ -1,5 +1,6 @@ package com.coder.toolbox.settings +import com.coder.toolbox.store.CODER_HEADER_COMMAND import com.coder.toolbox.store.CODER_SSH_CONFIG_OPTIONS import com.coder.toolbox.store.CoderSettingsStore import com.coder.toolbox.store.DISABLE_AUTOSTART @@ -236,6 +237,30 @@ internal class CoderSettingsTest { assertEquals(Pair("http://test.toolbox.coder.com$expected", null), got) } + @Test + fun testHeaderCommand() { + var settings = CoderSettingsStore( + pluginTestSettingsStore(HEADER_COMMAND to "header command from state"), + Environment(), logger + ) + assertEquals("header command from state", settings.readOnly().headerCommand) + + settings = CoderSettingsStore( + pluginTestSettingsStore(), + env = Environment(mapOf(CODER_HEADER_COMMAND to "header command from env")), + logger + ) + assertEquals("header command from env", settings.readOnly().headerCommand) + + // State has precedence. + settings = CoderSettingsStore( + pluginTestSettingsStore(HEADER_COMMAND to "header command from state"), + env = Environment(mapOf(CODER_HEADER_COMMAND to "header command from env")), + logger + ) + assertEquals("header command from state", settings.readOnly().headerCommand) + } + @Test fun testSSHConfigOptions() { var settings = CoderSettingsStore( From 5345773bb6b92d0e162d1faa8820a784141c81e8 Mon Sep 17 00:00:00 2001 From: Frank Olbricht Date: Tue, 18 Aug 2026 14:14:05 +0000 Subject: [PATCH 2/2] docs: drop CODER_URL mention and clarify the header command fallback wording --- README.md | 3 +-- .../com/coder/toolbox/settings/ReadOnlyCoderSettings.kt | 6 ++---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index e207d438..f8d73d81 100644 --- a/README.md +++ b/README.md @@ -509,8 +509,7 @@ explicit entry per resolved workspace/agent using expansion. - `Header command` command that outputs additional HTTP headers. Each line of output must be in the format key=value. - The environment variable CODER_URL will be available to the command process. If left blank, the - `CODER_HEADER_COMMAND` environment variable is used, if set. + When this setting is left blank, the `CODER_HEADER_COMMAND` environment variable is used instead, if set. - `lastDeploymentURL` the last Coder deployment URL that Coder Toolbox successfully authenticated to. diff --git a/src/main/kotlin/com/coder/toolbox/settings/ReadOnlyCoderSettings.kt b/src/main/kotlin/com/coder/toolbox/settings/ReadOnlyCoderSettings.kt index 9aff5c50..80f799f1 100644 --- a/src/main/kotlin/com/coder/toolbox/settings/ReadOnlyCoderSettings.kt +++ b/src/main/kotlin/com/coder/toolbox/settings/ReadOnlyCoderSettings.kt @@ -93,10 +93,8 @@ interface ReadOnlyCoderSettings { /** * An external command that outputs additional HTTP headers added to all * requests. The command must output each header as `key=value` on its own - * line. The following environment variables will be available to the - * process: CODER_URL. Falls back to the CODER_HEADER_COMMAND environment - * variable (the same variable the Coder CLI reads) when the setting is - * blank. + * line. When this setting is blank, the CODER_HEADER_COMMAND environment + * variable (the same variable the Coder CLI reads) is used instead, if set. */ val headerCommand: String?