diff --git a/CHANGELOG.md b/CHANGELOG.md index 3383697e..3ed26336 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,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 + ## 2.23.1 - 2026-01-21 ### Changed diff --git a/src/main/kotlin/com/coder/gateway/CoderSettingsConfigurable.kt b/src/main/kotlin/com/coder/gateway/CoderSettingsConfigurable.kt index 76096e98..76eac4fa 100644 --- a/src/main/kotlin/com/coder/gateway/CoderSettingsConfigurable.kt +++ b/src/main/kotlin/com/coder/gateway/CoderSettingsConfigurable.kt @@ -2,6 +2,7 @@ package com.coder.gateway import com.coder.gateway.services.CoderSettingsService import com.coder.gateway.services.CoderSettingsStateService +import com.coder.gateway.settings.CODER_HEADER_COMMAND import com.coder.gateway.settings.CODER_SSH_CONFIG_OPTIONS import com.coder.gateway.util.canCreateDirectory import com.intellij.openapi.components.service @@ -89,7 +90,10 @@ class CoderSettingsConfigurable : BoundConfigurable("Coder") { textField().resizableColumn().align(AlignX.FILL) .bindText(state::headerCommand) .comment( - CoderGatewayBundle.message("gateway.connector.settings.header-command.comment"), + CoderGatewayBundle.message( + "gateway.connector.settings.header-command.comment", + CODER_HEADER_COMMAND, + ), ) }.layout(RowLayout.PARENT_GRID) row(CoderGatewayBundle.message("gateway.connector.settings.tls-cert-path.title")) { diff --git a/src/main/kotlin/com/coder/gateway/settings/CoderSettings.kt b/src/main/kotlin/com/coder/gateway/settings/CoderSettings.kt index a189df82..3917b8a7 100644 --- a/src/main/kotlin/com/coder/gateway/settings/CoderSettings.kt +++ b/src/main/kotlin/com/coder/gateway/settings/CoderSettings.kt @@ -14,6 +14,7 @@ import java.nio.file.Files import java.nio.file.Path import java.nio.file.Paths +const val CODER_HEADER_COMMAND = "CODER_HEADER_COMMAND" const val CODER_SSH_CONFIG_OPTIONS = "CODER_SSH_CONFIG_OPTIONS" const val CODER_URL = "CODER_URL" @@ -76,8 +77,8 @@ open class CoderSettingsState( // 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. + // line. When this setting is blank, the CODER_HEADER_COMMAND environment + // variable is used instead, if set. open var headerCommand: String = "", // Optionally set this to the path of a certificate to use for TLS // connections. The certificate should be in X.509 PEM format. @@ -194,10 +195,12 @@ open class CoderSettings( val defaultSignatureNameByOsAndArch: String get() = getCoderSignatureForOS(getOS(), getArch()) /** - * A command to run to set headers for API calls. + * A command to run to set headers for API calls. Falls back to the + * CODER_HEADER_COMMAND environment variable (the same variable the Coder + * CLI reads) when the setting is blank. */ val headerCommand: String - get() = state.headerCommand + get() = state.headerCommand.ifBlank { env.get(CODER_HEADER_COMMAND) } /** * Whether to disable automatically starting a workspace when connecting. diff --git a/src/main/resources/messages/CoderGatewayBundle.properties b/src/main/resources/messages/CoderGatewayBundle.properties index 00afdbfa..5c34379d 100644 --- a/src/main/resources/messages/CoderGatewayBundle.properties +++ b/src/main/resources/messages/CoderGatewayBundle.properties @@ -82,8 +82,8 @@ gateway.connector.settings.fallback-on-coder-for-signatures.comment=Verify binar gateway.connector.settings.header-command.title=Header command gateway.connector.settings.header-command.comment=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. + output each header as `key=value` on its own line. When this setting is \ + left blank, the environment variable {0} is used instead, if set. gateway.connector.settings.tls-cert-path.title=Cert path gateway.connector.settings.tls-cert-path.comment=Optionally set this to \ the path of a certificate to use for TLS connections. The certificate \ diff --git a/src/test/kotlin/com/coder/gateway/settings/CoderSettingsTest.kt b/src/test/kotlin/com/coder/gateway/settings/CoderSettingsTest.kt index 71447db5..7d877a17 100644 --- a/src/test/kotlin/com/coder/gateway/settings/CoderSettingsTest.kt +++ b/src/test/kotlin/com/coder/gateway/settings/CoderSettingsTest.kt @@ -243,6 +243,27 @@ internal class CoderSettingsTest { assertEquals(Pair("http://test.gateway.coder.com$expected", null), got) } + @Test + fun testHeaderCommand() { + var settings = CoderSettings(CoderSettingsState(headerCommand = "header command from state")) + assertEquals("header command from state", settings.headerCommand) + + settings = + CoderSettings( + CoderSettingsState(), + env = Environment(mapOf(CODER_HEADER_COMMAND to "header command from env")), + ) + assertEquals("header command from env", settings.headerCommand) + + // State has precedence. + settings = + CoderSettings( + CoderSettingsState(headerCommand = "header command from state"), + env = Environment(mapOf(CODER_HEADER_COMMAND to "header command from env")), + ) + assertEquals("header command from state", settings.headerCommand) + } + @Test fun testSSHConfigOptions() { var settings = CoderSettings(CoderSettingsState(sshConfigOptions = "ssh config options from state"))