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