Skip to content

Commit 8b3b83f

Browse files
committedMar 1, 2024·
Allow prefixing env vars to avoid clashes
1 parent 296c77d commit 8b3b83f

File tree

3 files changed

+63
-12
lines changed

3 files changed

+63
-12
lines changed
 

‎README.md

+7-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,13 @@ $ SSL_DOMAIN=myapp.example.com thrust bin/rails server
4949
## Custom configuration
5050

5151
Thruster provides a number of environment variables that can be used to
52-
customize its behavior:
52+
customize its behavior.
53+
54+
To prevent naming clashes with your application's own environment variables,
55+
Thruster's environment variables can optionally be prefixed with `THRUSTER_`.
56+
For example, `SSL_DOMAIN` can also be set as `THRUSTER_SSL_DOMAIN`. Whenever a
57+
prefixed variable is set, Thruster will use it in preference to the unprefixed
58+
version.
5359

5460
| Variable Name | Description | Default Value |
5561
|-----------------------|---------------------------------------------------------------------------------|---------------|

‎internal/config.go

+27-11
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ const (
1212
KB = 1024
1313
MB = 1024 * KB
1414

15+
ENV_PREFIX = "THRUSTER_"
16+
1517
defaultTargetPort = 3000
1618

1719
defaultCacheSize = 64 * MB
@@ -73,7 +75,7 @@ func NewConfig() (*Config, error) {
7375
XSendfileEnabled: getEnvBool("X_SENDFILE_ENABLED", true),
7476
MaxRequestBody: getEnvInt("MAX_REQUEST_BODY", defaultMaxRequestBody),
7577

76-
SSLDomain: os.Getenv("SSL_DOMAIN"),
78+
SSLDomain: getEnvString("SSL_DOMAIN", ""),
7779
StoragePath: getEnvString("STORAGE_PATH", defaultStoragePath),
7880
BadGatewayPage: getEnvString("BAD_GATEWAY_PAGE", defaultBadGatewayPage),
7981

@@ -87,18 +89,32 @@ func NewConfig() (*Config, error) {
8789
}, nil
8890
}
8991

92+
func findEnv(key string) (string, bool) {
93+
value, ok := os.LookupEnv(ENV_PREFIX + key)
94+
if ok {
95+
return value, true
96+
}
97+
98+
value, ok = os.LookupEnv(key)
99+
if ok {
100+
return value, true
101+
}
102+
103+
return "", false
104+
}
105+
90106
func getEnvString(key, defaultValue string) string {
91-
value := os.Getenv(key)
92-
if value == "" {
93-
return defaultValue
107+
value, ok := findEnv(key)
108+
if ok {
109+
return value
94110
}
95111

96-
return value
112+
return defaultValue
97113
}
98114

99115
func getEnvInt(key string, defaultValue int) int {
100-
value := os.Getenv(key)
101-
if value == "" {
116+
value, ok := findEnv(key)
117+
if !ok {
102118
return defaultValue
103119
}
104120

@@ -111,8 +127,8 @@ func getEnvInt(key string, defaultValue int) int {
111127
}
112128

113129
func getEnvDuration(key string, defaultValue time.Duration) time.Duration {
114-
value := os.Getenv(key)
115-
if value == "" {
130+
value, ok := findEnv(key)
131+
if !ok {
116132
return defaultValue
117133
}
118134

@@ -125,8 +141,8 @@ func getEnvDuration(key string, defaultValue time.Duration) time.Duration {
125141
}
126142

127143
func getEnvBool(key string, defaultValue bool) bool {
128-
value := os.Getenv(key)
129-
if value == "" {
144+
value, ok := findEnv(key)
145+
if !ok {
130146
return defaultValue
131147
}
132148

‎internal/config_test.go

+29
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,35 @@ func TestConfig_override_defaults_with_env_vars(t *testing.T) {
3939
assert.Equal(t, slog.LevelDebug, c.LogLevel)
4040
}
4141

42+
func TestConfig_override_defaults_with_env_vars_using_prefix(t *testing.T) {
43+
usingProgramArgs(t, "thruster", "echo", "hello")
44+
usingEnvVar(t, "THRUSTER_TARGET_PORT", "4000")
45+
usingEnvVar(t, "THRUSTER_CACHE_SIZE", "256")
46+
usingEnvVar(t, "THRUSTER_HTTP_READ_TIMEOUT", "5")
47+
usingEnvVar(t, "THRUSTER_X_SENDFILE_ENABLED", "0")
48+
usingEnvVar(t, "THRUSTER_DEBUG", "1")
49+
50+
c, err := NewConfig()
51+
require.NoError(t, err)
52+
53+
assert.Equal(t, 4000, c.TargetPort)
54+
assert.Equal(t, 256, c.CacheSizeBytes)
55+
assert.Equal(t, 5*time.Second, c.HttpReadTimeout)
56+
assert.Equal(t, false, c.XSendfileEnabled)
57+
assert.Equal(t, slog.LevelDebug, c.LogLevel)
58+
}
59+
60+
func TestConfig_prefixed_variables_take_precedence_over_non_prefixed(t *testing.T) {
61+
usingProgramArgs(t, "thruster", "echo", "hello")
62+
usingEnvVar(t, "TARGET_PORT", "3000")
63+
usingEnvVar(t, "THRUSTER_TARGET_PORT", "4000")
64+
65+
c, err := NewConfig()
66+
require.NoError(t, err)
67+
68+
assert.Equal(t, 4000, c.TargetPort)
69+
}
70+
4271
func TestConfig_return_error_when_no_upstream_command(t *testing.T) {
4372
usingProgramArgs(t, "thruster")
4473

0 commit comments

Comments
 (0)
Please sign in to comment.