diff --git a/CHANGELOG.md b/CHANGELOG.md index 188cb1d84..8f5ff198d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ - Header values are now sanitised before logging when `log:config` is enabled #2930. +### Added + +- `listen:timeout:read` and `listen:timeout:write` config options for + setting HTTP server request read and response write timeouts. + ## v0.81 ### Fixed diff --git a/cmd/karma/main.go b/cmd/karma/main.go index 5d2d8ccef..80f3536da 100644 --- a/cmd/karma/main.go +++ b/cmd/karma/main.go @@ -465,8 +465,10 @@ func serve(errorHandling pflag.ErrorHandling) error { } httpServer := &http.Server{ - Addr: listen, - Handler: router, + Addr: listen, + Handler: router, + ReadTimeout: config.Config.Listen.Timeout.Read, + WriteTimeout: config.Config.Listen.Timeout.Write, } quit := make(chan os.Signal, 1) diff --git a/cmd/karma/tests/testscript/059_log_full_config_env.txt b/cmd/karma/tests/testscript/059_log_full_config_env.txt index 684641d48..1c45c4ea9 100644 --- a/cmd/karma/tests/testscript/059_log_full_config_env.txt +++ b/cmd/karma/tests/testscript/059_log_full_config_env.txt @@ -163,6 +163,9 @@ level=info msg=" - instance" level=info msg=" - cluster" level=info msg="listen:" level=info msg=" address: 127.0.0.1" +level=info msg=" timeout:" +level=info msg=" read: 10s" +level=info msg=" write: 20s" level=info msg=" tls:" level=info msg=" cert: \"\"" level=info msg=" key: \"\"" diff --git a/cmd/karma/tests/testscript/060_log_full_config_file.txt b/cmd/karma/tests/testscript/060_log_full_config_file.txt index d4629fbfe..4d9f5686b 100644 --- a/cmd/karma/tests/testscript/060_log_full_config_file.txt +++ b/cmd/karma/tests/testscript/060_log_full_config_file.txt @@ -188,6 +188,9 @@ level=info msg=" - instance" level=info msg=" - '@receiver'" level=info msg="listen:" level=info msg=" address: \"\"" +level=info msg=" timeout:" +level=info msg=" read: 10s" +level=info msg=" write: 20s" level=info msg=" tls:" level=info msg=" cert: \"\"" level=info msg=" key: \"\"" diff --git a/cmd/karma/tests/testscript/065_proxy-with-readonly.txt b/cmd/karma/tests/testscript/065_proxy-with-readonly.txt index f951dbb31..acff4194e 100644 --- a/cmd/karma/tests/testscript/065_proxy-with-readonly.txt +++ b/cmd/karma/tests/testscript/065_proxy-with-readonly.txt @@ -77,6 +77,9 @@ level=info msg=" static: []" level=info msg=" unique: []" level=info msg="listen:" level=info msg=" address: \"\"" +level=info msg=" timeout:" +level=info msg=" read: 10s" +level=info msg=" write: 20s" level=info msg=" tls:" level=info msg=" cert: \"\"" level=info msg=" key: \"\"" diff --git a/cmd/karma/tests/testscript/066_proxy.txt b/cmd/karma/tests/testscript/066_proxy.txt index 814673e0d..ce35e6628 100644 --- a/cmd/karma/tests/testscript/066_proxy.txt +++ b/cmd/karma/tests/testscript/066_proxy.txt @@ -77,6 +77,9 @@ level=info msg=" static: []" level=info msg=" unique: []" level=info msg="listen:" level=info msg=" address: \"\"" +level=info msg=" timeout:" +level=info msg=" read: 10s" +level=info msg=" write: 20s" level=info msg=" tls:" level=info msg=" cert: \"\"" level=info msg=" key: \"\"" diff --git a/cmd/karma/tests/testscript/067_readonly.txt b/cmd/karma/tests/testscript/067_readonly.txt index 35c5f22f6..81f23bfd6 100644 --- a/cmd/karma/tests/testscript/067_readonly.txt +++ b/cmd/karma/tests/testscript/067_readonly.txt @@ -77,6 +77,9 @@ level=info msg=" static: []" level=info msg=" unique: []" level=info msg="listen:" level=info msg=" address: \"\"" +level=info msg=" timeout:" +level=info msg=" read: 10s" +level=info msg=" write: 20s" level=info msg=" tls:" level=info msg=" cert: \"\"" level=info msg=" key: \"\"" diff --git a/cmd/karma/tests/testscript/068_sentry.txt b/cmd/karma/tests/testscript/068_sentry.txt index 94e82f049..0a2befd7b 100644 --- a/cmd/karma/tests/testscript/068_sentry.txt +++ b/cmd/karma/tests/testscript/068_sentry.txt @@ -79,6 +79,9 @@ level=info msg=" static: []" level=info msg=" unique: []" level=info msg="listen:" level=info msg=" address: 127.0.0.1" +level=info msg=" timeout:" +level=info msg=" read: 10s" +level=info msg=" write: 20s" level=info msg=" tls:" level=info msg=" cert: \"\"" level=info msg=" key: \"\"" diff --git a/cmd/karma/tests/testscript/070_upper_case_keys.txt b/cmd/karma/tests/testscript/070_upper_case_keys.txt index 220ca16c8..cfca1183d 100644 --- a/cmd/karma/tests/testscript/070_upper_case_keys.txt +++ b/cmd/karma/tests/testscript/070_upper_case_keys.txt @@ -87,6 +87,9 @@ level=info msg=" static: []" level=info msg=" unique: []" level=info msg="listen:" level=info msg=" address: \"\"" +level=info msg=" timeout:" +level=info msg=" read: 10s" +level=info msg=" write: 20s" level=info msg=" tls:" level=info msg=" cert: \"\"" level=info msg=" key: \"\"" diff --git a/cmd/karma/tests/testscript/094_shutdown_slow_client.txt b/cmd/karma/tests/testscript/094_shutdown_slow_client.txt index 691d80ae4..6b3c21e17 100644 --- a/cmd/karma/tests/testscript/094_shutdown_slow_client.txt +++ b/cmd/karma/tests/testscript/094_shutdown_slow_client.txt @@ -30,6 +30,10 @@ alertmanager: uri: http://127.0.0.1:9094 proxy: true debug: true +listen: + timeout: + read: 1m + write: 1m -- test.sh -- trap "echo got signal" SIGTERM SIGINT diff --git a/cmd/karma/tests/testscript/097_proxy_url_config.txt b/cmd/karma/tests/testscript/097_proxy_url_config.txt index 1ed7c2eaf..7eae3358b 100644 --- a/cmd/karma/tests/testscript/097_proxy_url_config.txt +++ b/cmd/karma/tests/testscript/097_proxy_url_config.txt @@ -77,6 +77,9 @@ level=info msg=" static: []" level=info msg=" unique: []" level=info msg="listen:" level=info msg=" address: \"\"" +level=info msg=" timeout:" +level=info msg=" read: 10s" +level=info msg=" write: 20s" level=info msg=" tls:" level=info msg=" cert: \"\"" level=info msg=" key: \"\"" diff --git a/docs/CONFIGURATION.md b/docs/CONFIGURATION.md index 82d4322c2..b935fbca7 100644 --- a/docs/CONFIGURATION.md +++ b/docs/CONFIGURATION.md @@ -852,6 +852,9 @@ Syntax: listen: address: string port: integer + timeout: + read: duration + write: duration prefix: string tls: cert: string @@ -860,6 +863,8 @@ listen: - `address` - Hostname or IP to listen on. - `port` - HTTP port to listen on. +- `timeout:read` - HTTP server request read timeout +- `timeout:write` - HTTP server response write timeout - `prefix` - URL root for karma, you can use to if you wish to serve it from location other than `/`. This option is mostly useful when using karma behind reverse proxy with other services on the same IP but different URL root. diff --git a/internal/config/config.go b/internal/config/config.go index 464f2039a..f1d5c27af 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -114,6 +114,8 @@ func SetupFlags(f *pflag.FlagSet) { f.String("listen.prefix", "/", "URL prefix") f.String("listen.tls.cert", "", "TLS certificate path (enables HTTPS)") f.String("listen.tls.key", "", "TLS key path (enables HTTPS)") + f.Duration("listen.timeout.read", time.Second*10, "HTTP request read timeout") + f.Duration("listen.timeout.write", time.Second*20, "HTTP response write timeout") f.String("sentry.public", "", "Sentry DSN for Go exceptions") f.String("sentry.private", "", "Sentry DSN for JavaScript exceptions") diff --git a/internal/config/config_test.go b/internal/config/config_test.go index afda2e702..001beae38 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -102,6 +102,9 @@ labels: - gg listen: address: 0.0.0.0 + timeout: + read: 10s + write: 20s tls: cert: "" key: "" diff --git a/internal/config/models.go b/internal/config/models.go index ad725189b..4f6d7603d 100644 --- a/internal/config/models.go +++ b/internal/config/models.go @@ -137,7 +137,11 @@ type configSchema struct { } Listen struct { Address string - TLS struct { + Timeout struct { + Read time.Duration + Write time.Duration + } + TLS struct { Cert string Key string }