From 367ccc473347959cb7edff5dbd1fc36977cf9f67 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Fri, 29 May 2026 11:08:01 +0300 Subject: fix(httpclient): tune transport defaults for pq --- internal/httpclient/client.go | 20 +++++++++++++++++++- internal/httpclient/client_test.go | 20 ++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) (limited to 'internal/httpclient') diff --git a/internal/httpclient/client.go b/internal/httpclient/client.go index 5c57cdc..79605e3 100644 --- a/internal/httpclient/client.go +++ b/internal/httpclient/client.go @@ -9,8 +9,26 @@ import ( const DefaultTimeout = 30 * time.Second +const ( + defaultTLSHandshakeTimeout = 10 * time.Second + defaultResponseHeaderTimeout = 15 * time.Second + defaultIdleConnTimeout = 90 * time.Second + defaultMaxIdleConnsPerHost = 10 +) + +var defaultTransport = func() *http.Transport { + transport := http.DefaultTransport.(*http.Transport).Clone() + transport.TLSHandshakeTimeout = defaultTLSHandshakeTimeout + transport.ResponseHeaderTimeout = defaultResponseHeaderTimeout + transport.IdleConnTimeout = defaultIdleConnTimeout + transport.MaxIdleConnsPerHost = defaultMaxIdleConnsPerHost + + return transport +}() + var defaultClient = &http.Client{ - Timeout: DefaultTimeout, + Timeout: DefaultTimeout, + Transport: defaultTransport, } func Do(req *http.Request) (*http.Response, error) { diff --git a/internal/httpclient/client_test.go b/internal/httpclient/client_test.go index a8b2216..787cc46 100644 --- a/internal/httpclient/client_test.go +++ b/internal/httpclient/client_test.go @@ -42,3 +42,23 @@ func TestDo_UsesSharedTimeout(t *testing.T) { t.Fatalf("expected shared timeout %v, got %v", DefaultTimeout, defaultClient.Timeout) } } + +func TestDo_UsesConfiguredTransportSettings(t *testing.T) { + transport, ok := defaultClient.Transport.(*http.Transport) + if !ok { + t.Fatalf("expected *http.Transport, got %T", defaultClient.Transport) + } + + if transport.TLSHandshakeTimeout != defaultTLSHandshakeTimeout { + t.Fatalf("expected TLS handshake timeout %v, got %v", defaultTLSHandshakeTimeout, transport.TLSHandshakeTimeout) + } + if transport.ResponseHeaderTimeout != defaultResponseHeaderTimeout { + t.Fatalf("expected response header timeout %v, got %v", defaultResponseHeaderTimeout, transport.ResponseHeaderTimeout) + } + if transport.IdleConnTimeout != defaultIdleConnTimeout { + t.Fatalf("expected idle connection timeout %v, got %v", defaultIdleConnTimeout, transport.IdleConnTimeout) + } + if transport.MaxIdleConnsPerHost != defaultMaxIdleConnsPerHost { + t.Fatalf("expected max idle conns per host %d, got %d", defaultMaxIdleConnsPerHost, transport.MaxIdleConnsPerHost) + } +} -- cgit v1.2.3