KeepAlive: 30 * time.Second,
DualStack: true,
}).DialContext,
- MaxIdleConns: 100,
- IdleConnTimeout: 90 * time.Second,
- TLSHandshakeTimeout: 10 * time.Second,
- ExpectContinueTimeout: 1 * time.Second,
+ DialerAndTLSConfigSupportsHTTP2: true,
+ MaxIdleConns: 100,
+ IdleConnTimeout: 90 * time.Second,
+ TLSHandshakeTimeout: 10 * time.Second,
+ ExpectContinueTimeout: 1 * time.Second,
}
// DefaultMaxIdleConnsPerHost is the default value of Transport's
// h2transport (via onceSetNextProtoDefaults)
nextProtoOnce sync.Once
h2transport h2Transport // non-nil if http2 wired up
+
+ // DialerAndTLSConfigSupportsHTTP2 controls whether HTTP/2 is enabled when a non-zero
+ // TLSClientConfig or Dial, DialTLS or DialContext func is provided. By default, use of any those fields conservatively
+ // disables HTTP/2. To use a customer dialer or TLS config and still attempt HTTP/2
+ // upgrades, set this to true.
+ DialerAndTLSConfigSupportsHTTP2 bool
}
// h2Transport is the interface we expect to be able to call from
// Transport.
return
}
- if t.TLSClientConfig != nil || t.Dial != nil || t.DialTLS != nil {
+ if !t.DialerAndTLSConfigSupportsHTTP2 && (t.TLSClientConfig != nil || t.Dial != nil || t.DialTLS != nil || t.DialContext != nil) {
// Be conservative and don't automatically enable
// http2 if they've specified a custom TLS config or
// custom dialers. Let them opt-in themselves via
// http2.ConfigureTransport so we don't surprise them
// by modifying their tls.Config. Issue 14275.
+ // However, if DialerAndTLSConfigSupportsHTTP2 is true, it overrides the above checks.
return
}
t2, err := http2configureTransport(t)
testTransportAutoHTTP(t, &Transport{}, true)
}
+func TestTransportAutomaticHTTP2_DialerAndTLSConfigSupportsHTTP2AndTLSConfig(t *testing.T) {
+ testTransportAutoHTTP(t, &Transport{
+ DialerAndTLSConfigSupportsHTTP2: true,
+ TLSClientConfig: new(tls.Config),
+ }, true)
+}
+
// golang.org/issue/14391: also check DefaultTransport
func TestTransportAutomaticHTTP2_DefaultTransport(t *testing.T) {
testTransportAutoHTTP(t, DefaultTransport.(*Transport), true)
}, false)
}
+func TestTransportAutomaticHTTP2_DialContext(t *testing.T) {
+ var d net.Dialer
+ testTransportAutoHTTP(t, &Transport{
+ DialContext: d.DialContext,
+ }, false)
+}
+
func TestTransportAutomaticHTTP2_DialTLS(t *testing.T) {
testTransportAutoHTTP(t, &Transport{
DialTLS: func(network, addr string) (net.Conn, error) {