summaryrefslogtreecommitdiff
path: root/internal/httpclient
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-05-29 11:08:01 +0300
committerPaul Buetow <paul@buetow.org>2026-05-29 11:08:01 +0300
commit367ccc473347959cb7edff5dbd1fc36977cf9f67 (patch)
treed8d93e4466659d48a91f969059f7e2aa574c46ea /internal/httpclient
parentf8ca4b8373ee4e7b9f9c0c0497117a52f09534bf (diff)
fix(httpclient): tune transport defaults for pq
Diffstat (limited to 'internal/httpclient')
-rw-r--r--internal/httpclient/client.go20
-rw-r--r--internal/httpclient/client_test.go20
2 files changed, 39 insertions, 1 deletions
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)
+ }
+}