401778b7e2
The docker client has historically used Transport.TLSClientConfig to set the scheme for the API client. A recent moved the resolution to use the http.Transport directly, rather than save the TLSClientConfig state on a client struct. This caused issues when mutliple calls made with a single client would have this field set in the http package on pre-1.7 installations. This fix detects the presence of the TLSClientConfig once and sets the scheme accordingly. We still don't know why this issue doesn't happen with Go 1.7 but it must be more deterministic in the newer version. Signed-off-by: Stephen J Day <stephen.day@docker.com>
28 lines
712 B
Go
28 lines
712 B
Go
package client
|
|
|
|
import (
|
|
"crypto/tls"
|
|
"errors"
|
|
"net/http"
|
|
)
|
|
|
|
var errTLSConfigUnavailable = errors.New("TLSConfig unavailable")
|
|
|
|
// transportFunc allows us to inject a mock transport for testing. We define it
|
|
// here so we can detect the tlsconfig and return nil for only this type.
|
|
type transportFunc func(*http.Request) (*http.Response, error)
|
|
|
|
func (tf transportFunc) RoundTrip(req *http.Request) (*http.Response, error) {
|
|
return tf(req)
|
|
}
|
|
|
|
// resolveTLSConfig attempts to resolve the tls configuration from the
|
|
// RoundTripper.
|
|
func resolveTLSConfig(transport http.RoundTripper) *tls.Config {
|
|
switch tr := transport.(type) {
|
|
case *http.Transport:
|
|
return tr.TLSClientConfig
|
|
default:
|
|
return nil
|
|
}
|
|
}
|