diff --git a/httpclient/client.go b/httpclient/client.go index f4d4aab..24f4c9e 100644 --- a/httpclient/client.go +++ b/httpclient/client.go @@ -35,18 +35,18 @@ type Client struct { // Options/Variables for Client type ClientConfig struct { - Integration APIIntegration - HideSensitiveData bool - CustomCookies []*http.Cookie - MaxRetryAttempts int - MaxConcurrentRequests int - EnableDynamicRateLimiting bool - CustomTimeout time.Duration - TokenRefreshBufferPeriod time.Duration - TotalRetryDuration time.Duration // TODO do we need this now it's in the integration? - FollowRedirects bool - MaxRedirects int - ConcurrencyManagementEnabled bool + Integration APIIntegration + HideSensitiveData bool + CustomCookies []*http.Cookie + MaxRetryAttempts int + MaxConcurrentRequests int + EnableDynamicRateLimiting bool + CustomTimeout time.Duration + TokenRefreshBufferPeriod time.Duration + TotalRetryDuration time.Duration // TODO do we need this now it's in the integration? + FollowRedirects bool + MaxRedirects int + EnableConcurrencyManagement bool } // BuildClient creates a new HTTP client with the provided configuration. diff --git a/httpclient/config_validation.go b/httpclient/config_validation.go index dadfcca..d09376b 100644 --- a/httpclient/config_validation.go +++ b/httpclient/config_validation.go @@ -7,25 +7,28 @@ import ( "errors" "fmt" "io" + "net/http" "os" + "strings" "time" ) const ( - DefaultLogLevelString = "LogLevelInfo" - DefaultLogOutputFormatString = "pretty" - DefaultLogConsoleSeparator = " " - DefaultLogExportPath = "/defaultlogs" - DefaultMaxRetryAttempts = 3 - DefaultMaxConcurrentRequests = 1 - DefaultExportLogs = false - DefaultHideSensitiveData = false - DefaultEnableDynamicRateLimiting = false - DefaultCustomTimeout = 5 * time.Second - DefaultTokenRefreshBufferPeriod = 2 * time.Minute - DefaultTotalRetryDuration = 5 * time.Minute - DefaultFollowRedirects = false - DefaultMaxRedirects = 5 + DefaultLogLevelString = "LogLevelInfo" + DefaultLogOutputFormatString = "pretty" + DefaultLogConsoleSeparator = " " + DefaultLogExportPath = "/defaultlogs" + DefaultMaxRetryAttempts = 3 + DefaultMaxConcurrentRequests = 1 + DefaultExportLogs = false + DefaultHideSensitiveData = false + DefaultEnableDynamicRateLimiting = false + DefaultCustomTimeout = 5 * time.Second + DefaultTokenRefreshBufferPeriod = 2 * time.Minute + DefaultTotalRetryDuration = 5 * time.Minute + DefaultFollowRedirects = false + DefaultMaxRedirects = 5 + DefaultEnableConcurrencyManagement = false ) // LoadConfigFromFile loads http client configuration settings from a JSON file. @@ -62,15 +65,32 @@ func LoadConfigFromFile(filepath string) (*ClientConfig, error) { // If any environment variables are not set, the default values defined in the constants are used instead. func LoadConfigFromEnv() (*ClientConfig, error) { config := &ClientConfig{ - HideSensitiveData: getEnvAsBool("HIDE_SENSITIVE_DATA", DefaultHideSensitiveData), - MaxRetryAttempts: getEnvAsInt("MAX_RETRY_ATTEMPTS", DefaultMaxRetryAttempts), - MaxConcurrentRequests: getEnvAsInt("MAX_CONCURRENT_REQUESTS", DefaultMaxConcurrentRequests), - EnableDynamicRateLimiting: getEnvAsBool("ENABLE_DYNAMIC_RATE_LIMITING", DefaultEnableDynamicRateLimiting), - CustomTimeout: getEnvAsDuration("CUSTOM_TIMEOUT", DefaultCustomTimeout), - TokenRefreshBufferPeriod: getEnvAsDuration("TOKEN_REFRESH_BUFFER_PERIOD", DefaultTokenRefreshBufferPeriod), - TotalRetryDuration: getEnvAsDuration("TOTAL_RETRY_DURATION", DefaultTotalRetryDuration), - FollowRedirects: getEnvAsBool("FOLLOW_REDIRECTS", DefaultFollowRedirects), - MaxRedirects: getEnvAsInt("MAX_REDIRECTS", DefaultMaxRedirects), + HideSensitiveData: getEnvAsBool("HIDE_SENSITIVE_DATA", DefaultHideSensitiveData), + MaxRetryAttempts: getEnvAsInt("MAX_RETRY_ATTEMPTS", DefaultMaxRetryAttempts), + MaxConcurrentRequests: getEnvAsInt("MAX_CONCURRENT_REQUESTS", DefaultMaxConcurrentRequests), + EnableDynamicRateLimiting: getEnvAsBool("ENABLE_DYNAMIC_RATE_LIMITING", DefaultEnableDynamicRateLimiting), + CustomTimeout: getEnvAsDuration("CUSTOM_TIMEOUT", DefaultCustomTimeout), + TokenRefreshBufferPeriod: getEnvAsDuration("TOKEN_REFRESH_BUFFER_PERIOD", DefaultTokenRefreshBufferPeriod), + TotalRetryDuration: getEnvAsDuration("TOTAL_RETRY_DURATION", DefaultTotalRetryDuration), + FollowRedirects: getEnvAsBool("FOLLOW_REDIRECTS", DefaultFollowRedirects), + MaxRedirects: getEnvAsInt("MAX_REDIRECTS", DefaultMaxRedirects), + EnableConcurrencyManagement: getEnvAsBool("ENABLE_CONCURRENCY_MANAGEMENT", DefaultEnableConcurrencyManagement), + } + + // Load custom cookies from environment variables. + customCookies := getEnvAsString("CUSTOM_COOKIES", "") + if customCookies != "" { + cookies := []*http.Cookie{} + for _, cookie := range strings.Split(customCookies, ";") { + parts := strings.SplitN(cookie, "=", 2) + if len(parts) == 2 { + cookies = append(cookies, &http.Cookie{ + Name: parts[0], + Value: parts[1], + }) + } + } + config.CustomCookies = cookies } return config, nil