From d698a49cfb9d320d03a0ad8c9fa18fa3da5c2fd2 Mon Sep 17 00:00:00 2001 From: Fredrik Berntsson Date: Mon, 17 Mar 2025 18:57:01 +0100 Subject: [PATCH] Use envconfig and add tests. --- README.md | 1 + internal/config/config.go | 19 +++++++------------ internal/config/config_test.go | 3 +++ testdata/.env | 1 + 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 76cff8e..236a802 100644 --- a/README.md +++ b/README.md @@ -86,6 +86,7 @@ The following environment variables can be specified: | `TZ` | n/a | `Europe/London` | Specifies the timezone for logs and cron | | `CLIENT_SKIP_TLS_VERIFICATION` | false | true | Skips SSL certificate verification | | `CLIENT_RETRY_DELAY_SECONDS` | 1 | 5 | Seconds to delay between connection attempts | +| `CLIENT_TIMEOUT_SECONDS` | 20 | 60 | Http client timeout in seconds | > **Note:** The following optional settings apply only if `FULL_SYNC=false`. They allow for granular control of synchronization if a full sync is not wanted. diff --git a/internal/config/config.go b/internal/config/config.go index 8dd32f9..2204431 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -3,6 +3,9 @@ package config import ( "crypto/tls" "fmt" + "net/http" + "time" + "github.com/joho/godotenv" "github.com/kelseyhightower/envconfig" "github.com/lovelaze/nebula-sync/internal/pihole/model" @@ -19,6 +22,7 @@ type Config struct { type Client struct { SkipSSLVerification bool `default:"false" envconfig:"CLIENT_SKIP_TLS_VERIFICATION"` RetryDelay int64 `default:"1" envconfig:"CLIENT_RETRY_DELAY_SECONDS"` + Timeout uint `default:"20" envconfig:"CLIENT_TIMEOUT_SECONDS"` } type GravitySettings struct { @@ -119,20 +123,11 @@ func (c *Config) String() string { return fmt.Sprintf("primary=%s, replicas=%s, fullSync=%t, cron=%s, sync=%s", c.Primary.Url, replicas, c.Sync.FullSync, cron, sync) } -func (cs *Client) NewHttpClient() *http.Client { - defaultTimeout := 20 * time.Second - - timeoutEnv := os.Getenv("HTTP_CLIENT_TIMEOUT") - if timeoutEnv != "" { - if timeout, err := strconv.Atoi(timeoutEnv); err == nil { - defaultTimeout = time.Duration(timeout) * time.Second - } - } - +func (settings *Client) NewHttpClient() *http.Client { return &http.Client{ - Timeout: defaultTimeout, + Timeout: time.Duration(settings.Timeout) * time.Second, Transport: &http.Transport{ - TLSClientConfig: &tls.Config{InsecureSkipVerify: cs.SkipSSLVerification}, + TLSClientConfig: &tls.Config{InsecureSkipVerify: settings.SkipSSLVerification}, }, } } diff --git a/internal/config/config_test.go b/internal/config/config_test.go index 564e3d5..ae4896a 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -82,11 +82,13 @@ func TestConfig_LoadClient(t *testing.T) { conf := Config{} t.Setenv("CLIENT_SKIP_TLS_VERIFICATION", "true") + t.Setenv("CLIENT_TIMEOUT_SECONDS", "45") err := conf.loadClient() require.NoError(t, err) assert.Equal(t, true, conf.Client.SkipSSLVerification) + assert.Equal(t, uint(45), conf.Client.Timeout) } func TestConfig_LoadEnvFile(t *testing.T) { @@ -102,6 +104,7 @@ func TestConfig_LoadEnvFile(t *testing.T) { assert.Equal(t, "Europe/London", os.Getenv("TZ")) assert.Equal(t, "true", os.Getenv("CLIENT_SKIP_TLS_VERIFICATION")) + assert.Equal(t, "40", os.Getenv("CLIENT_TIMEOUT_SECONDS")) assert.Equal(t, "true", os.Getenv("SYNC_CONFIG_DNS")) assert.Equal(t, "true", os.Getenv("SYNC_CONFIG_DHCP")) diff --git a/testdata/.env b/testdata/.env index 927e9f0..aedf874 100644 --- a/testdata/.env +++ b/testdata/.env @@ -6,6 +6,7 @@ CRON=* * * * * TZ=Europe/London CLIENT_SKIP_TLS_VERIFICATION=true +CLIENT_TIMEOUT_SECONDS=40 SYNC_CONFIG_DNS=true SYNC_CONFIG_DHCP=true