@@ -148,12 +148,20 @@ func (c *Client) defaultTimeout(ctx context.Context) time.Duration {
148148 return time .Until (deadline ) / time .Duration (l )
149149}
150150
151+ func cloneHTTPClient (old * http.Client ) * http.Client {
152+ client := * old
153+ transport , ok := client .Transport .(* http.Transport )
154+ if ! ok {
155+ panic (fmt .Errorf ("expected an http client of type http.Transport, got %T instead" , client .Transport ))
156+ }
157+ client .Transport = transport .Clone ()
158+ return & client
159+ }
160+
151161func (c * Client ) registerRPCProvider () error {
152162 driverRPC := rpc .New (c .providerConfig .rpc .ConsumerURL , c .Auth .Host , c .providerConfig .rpc .Opts .HMAC .Secrets )
153163 c .providerConfig .rpc .Logger = c .Logger
154- httpClient := * c .httpClient
155- httpClient .Transport = c .httpClient .Transport .(* http.Transport ).Clone ()
156- c .providerConfig .rpc .HTTPClient = & httpClient
164+ c .providerConfig .rpc .HTTPClient = cloneHTTPClient (c .httpClient )
157165 if err := mergo .Merge (driverRPC , c .providerConfig .rpc , mergo .WithOverride , mergo .WithTransformers (& rpc.Provider {})); err != nil {
158166 return fmt .Errorf ("failed to merge user specified rpc config with the config defaults, rpc provider not available: %w" , err )
159167 }
@@ -183,18 +191,15 @@ func (c *Client) registerIPMIProvider() error {
183191
184192// register ASRR vendorapi provider
185193func (c * Client ) registerASRRProvider () {
186- asrHttpClient := * c .httpClient
187- asrHttpClient .Transport = c .httpClient .Transport .(* http.Transport ).Clone ()
188- driverAsrockrack := asrockrack .NewWithOptions (c .Auth .Host + ":" + c .providerConfig .asrock .Port , c .Auth .User , c .Auth .Pass , c .Logger , asrockrack .WithHTTPClient (& asrHttpClient ))
194+ asrHttpClient := cloneHTTPClient (c .httpClient )
195+ driverAsrockrack := asrockrack .NewWithOptions (c .Auth .Host + ":" + c .providerConfig .asrock .Port , c .Auth .User , c .Auth .Pass , c .Logger , asrockrack .WithHTTPClient (asrHttpClient ))
189196 c .Registry .Register (asrockrack .ProviderName , asrockrack .ProviderProtocol , asrockrack .Features , nil , driverAsrockrack )
190197}
191198
192199// register gofish provider
193200func (c * Client ) registerGofishProvider () {
194- gfHttpClient := * c .httpClient
195- gfHttpClient .Transport = c .httpClient .Transport .(* http.Transport ).Clone ()
196201 gofishOpts := []redfish.Option {
197- redfish .WithHttpClient (& gfHttpClient ),
202+ redfish .WithHttpClient (cloneHTTPClient ( c . httpClient ) ),
198203 redfish .WithVersionsNotCompatible (c .providerConfig .gofish .VersionsNotCompatible ),
199204 redfish .WithUseBasicAuth (c .providerConfig .gofish .UseBasicAuth ),
200205 redfish .WithPort (c .providerConfig .gofish .Port ),
@@ -233,29 +238,25 @@ func (c *Client) registerDellProvider() {
233238
234239// register supermicro vendorapi provider
235240func (c * Client ) registerSupermicroProvider () {
236- smcHttpClient := * c .httpClient
237- smcHttpClient .Transport = c .httpClient .Transport .(* http.Transport ).Clone ()
238241 driverSupermicro := supermicro .NewClient (
239242 c .Auth .Host ,
240243 c .Auth .User ,
241244 c .Auth .Pass ,
242245 c .Logger ,
243- supermicro .WithHttpClient (& smcHttpClient ),
246+ supermicro .WithHttpClient (cloneHTTPClient ( c . httpClient ) ),
244247 supermicro .WithPort (c .providerConfig .supermicro .Port ),
245248 )
246249
247250 c .Registry .Register (supermicro .ProviderName , supermicro .ProviderProtocol , supermicro .Features , nil , driverSupermicro )
248251}
249252
250253func (c * Client ) registerOpenBMCProvider () {
251- httpClient := * c .httpClient
252- httpClient .Transport = c .httpClient .Transport .(* http.Transport ).Clone ()
253254 driver := openbmc .New (
254255 c .Auth .Host ,
255256 c .Auth .User ,
256257 c .Auth .Pass ,
257258 c .Logger ,
258- openbmc .WithHttpClient (& httpClient ),
259+ openbmc .WithHttpClient (cloneHTTPClient ( c . httpClient ) ),
259260 openbmc .WithPort (c .providerConfig .openbmc .Port ),
260261 )
261262
@@ -371,7 +372,7 @@ func (c *Client) Open(ctx context.Context) error {
371372}
372373
373374// Close pass through to library function
374- func (c * Client ) Close (ctx context.Context ) (err error ) {
375+ func (c * Client ) Close (ctx context.Context ) (err error ) { // nolint:contextcheck
375376 ctx , span := c .traceprovider .Tracer (pkgName ).Start (ctx , "Close" )
376377 defer span .End ()
377378
0 commit comments