refactor(http): mark transportOf as must-style to surface panic risk
oesni committed
May 4, 2026 at 14:23 UTC
30b0c42cd7aab037f5085ec84ad3a703e5f24472
1 file changed
+14
-11
utils/http.go
+14
-11
@@ -28,7 +28,10 @@ func NewHTTPClient(options ...HTTPClientOption) *http.Client {
28
return client
29
}
30
31
-func transportOf(c *http.Client) *http.Transport {
31
+// mustTransportOf returns c.Transport as *http.Transport.
32
+// Panics if c.Transport is nil or not *http.Transport — only safe for clients
33
+// created by NewHTTPClient, whose Transport is always a fresh *http.Transport.
34
+func mustTransportOf(c *http.Client) *http.Transport {
35
return c.Transport.(*http.Transport)
36
}
37
@@ -41,58 +44,58 @@ func WithHTTPTimeout(timeout time.Duration) HTTPClientOption {
44
func WithHTTPTLSConfig(tlsConfig *tls.Config) HTTPClientOption {
45
return func(c *http.Client) {
46
if tlsConfig == nil {
44
- transportOf(c).TLSClientConfig = nil
47
+ mustTransportOf(c).TLSClientConfig = nil
48
return
49
}
47
- transportOf(c).TLSClientConfig = tlsConfig.Clone()
50
+ mustTransportOf(c).TLSClientConfig = tlsConfig.Clone()
51
}
52
}
53
54
func WithHTTPDialContext(dialContext func(context.Context, string, string) (net.Conn, error)) HTTPClientOption {
55
return func(c *http.Client) {
53
- transportOf(c).DialContext = dialContext
56
+ mustTransportOf(c).DialContext = dialContext
57
}
58
}
59
60
func WithoutHTTP2() HTTPClientOption {
61
return func(c *http.Client) {
59
- transportOf(c).ForceAttemptHTTP2 = false
62
+ mustTransportOf(c).ForceAttemptHTTP2 = false
63
}
64
}
65
66
func WithHTTPResponseHeaderTimeout(timeout time.Duration) HTTPClientOption {
67
return func(c *http.Client) {
65
- transportOf(c).ResponseHeaderTimeout = timeout
68
+ mustTransportOf(c).ResponseHeaderTimeout = timeout
69
}
70
}
71
72
func WithHTTPIdleConnTimeout(timeout time.Duration) HTTPClientOption {
73
return func(c *http.Client) {
71
- transportOf(c).IdleConnTimeout = timeout
74
+ mustTransportOf(c).IdleConnTimeout = timeout
75
}
76
}
77
78
func WithHTTPMaxIdleConns(maxIdleConns int) HTTPClientOption {
79
return func(c *http.Client) {
77
- transportOf(c).MaxIdleConns = maxIdleConns
80
+ mustTransportOf(c).MaxIdleConns = maxIdleConns
81
}
82
}
83
84
func WithHTTPMaxIdleConnsPerHost(maxIdleConnsPerHost int) HTTPClientOption {
85
return func(c *http.Client) {
83
- transportOf(c).MaxIdleConnsPerHost = maxIdleConnsPerHost
86
+ mustTransportOf(c).MaxIdleConnsPerHost = maxIdleConnsPerHost
87
}
88
}
89
90
func WithHTTPTLSHandshakeTimeout(timeout time.Duration) HTTPClientOption {
91
return func(c *http.Client) {
89
- transportOf(c).TLSHandshakeTimeout = timeout
92
+ mustTransportOf(c).TLSHandshakeTimeout = timeout
93
}
94
}
95
96
func WithHTTPExpectContinueTimeout(timeout time.Duration) HTTPClientOption {
97
return func(c *http.Client) {
95
- transportOf(c).ExpectContinueTimeout = timeout
98
+ mustTransportOf(c).ExpectContinueTimeout = timeout
99
}
100
}
101