mirror of https://github.com/golang/go.git
net/http: fix detection of Roundtrippers that always error
CL 220905 added code to identify alternate transports that always error by using http2erringRoundTripper. This does not work when the transport is from another package, e.g., http2.erringRoundTripper. Expose a new method that allow detection of such a RoundTripper. Switch to an interface that is both a RoundTripper and can return the underlying error. Fixes #40213 Change-Id: I170739857ab9e99dffb5fa55c99b24b23c2f9c54 Reviewed-on: https://go-review.googlesource.com/c/go/+/243258 Reviewed-by: Emmanuel Odeke <emm.odeke@gmail.com> Run-TryBot: Emmanuel Odeke <emm.odeke@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
3d774611fe
commit
8381408048
|
|
@ -32,10 +32,6 @@ type http2Transport struct {
|
|||
func (*http2Transport) RoundTrip(*Request) (*Response, error) { panic(noHTTP2) }
|
||||
func (*http2Transport) CloseIdleConnections() {}
|
||||
|
||||
type http2erringRoundTripper struct{ err error }
|
||||
|
||||
func (http2erringRoundTripper) RoundTrip(*Request) (*Response, error) { panic(noHTTP2) }
|
||||
|
||||
type http2noDialH2RoundTripper struct{}
|
||||
|
||||
func (http2noDialH2RoundTripper) RoundTrip(*Request) (*Response, error) { panic(noHTTP2) }
|
||||
|
|
|
|||
|
|
@ -1528,6 +1528,10 @@ func (pconn *persistConn) addTLS(name string, trace *httptrace.ClientTrace) erro
|
|||
return nil
|
||||
}
|
||||
|
||||
type erringRoundTripper interface {
|
||||
RoundTripErr() error
|
||||
}
|
||||
|
||||
func (t *Transport) dialConn(ctx context.Context, cm connectMethod) (pconn *persistConn, err error) {
|
||||
pconn = &persistConn{
|
||||
t: t,
|
||||
|
|
@ -1694,9 +1698,9 @@ func (t *Transport) dialConn(ctx context.Context, cm connectMethod) (pconn *pers
|
|||
if s := pconn.tlsState; s != nil && s.NegotiatedProtocolIsMutual && s.NegotiatedProtocol != "" {
|
||||
if next, ok := t.TLSNextProto[s.NegotiatedProtocol]; ok {
|
||||
alt := next(cm.targetAddr, pconn.conn.(*tls.Conn))
|
||||
if e, ok := alt.(http2erringRoundTripper); ok {
|
||||
if e, ok := alt.(erringRoundTripper); ok {
|
||||
// pconn.conn was closed by next (http2configureTransport.upgradeFn).
|
||||
return nil, e.err
|
||||
return nil, e.RoundTripErr()
|
||||
}
|
||||
return &persistConn{t: t, cacheKey: pconn.cacheKey, alt: alt}, nil
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue