diff options
Diffstat (limited to 'src/net')
| -rw-r--r-- | src/net/http/export_test.go | 2 | ||||
| -rw-r--r-- | src/net/http/h2_bundle.go | 23 | ||||
| -rw-r--r-- | src/net/http/omithttp2.go | 2 | ||||
| -rw-r--r-- | src/net/http/transport.go | 4 |
4 files changed, 25 insertions, 6 deletions
diff --git a/src/net/http/export_test.go b/src/net/http/export_test.go index 67a74ae19f..096a6d382a 100644 --- a/src/net/http/export_test.go +++ b/src/net/http/export_test.go @@ -254,7 +254,7 @@ func hookSetter(dst *func()) func(func()) { } func ExportHttp2ConfigureTransport(t *Transport) error { - t2, err := http2configureTransport(t) + t2, err := http2configureTransports(t) if err != nil { return err } diff --git a/src/net/http/h2_bundle.go b/src/net/http/h2_bundle.go index 5b92eb234b..e52903ffe9 100644 --- a/src/net/http/h2_bundle.go +++ b/src/net/http/h2_bundle.go @@ -6656,12 +6656,21 @@ func (t *http2Transport) pingTimeout() time.Duration { // ConfigureTransport configures a net/http HTTP/1 Transport to use HTTP/2. // It returns an error if t1 has already been HTTP/2-enabled. +// +// Use ConfigureTransports instead to configure the HTTP/2 Transport. func http2ConfigureTransport(t1 *Transport) error { - _, err := http2configureTransport(t1) + _, err := http2ConfigureTransports(t1) return err } -func http2configureTransport(t1 *Transport) (*http2Transport, error) { +// ConfigureTransports configures a net/http HTTP/1 Transport to use HTTP/2. +// It returns a new HTTP/2 Transport for further configuration. +// It returns an error if t1 has already been HTTP/2-enabled. +func http2ConfigureTransports(t1 *Transport) (*http2Transport, error) { + return http2configureTransports(t1) +} + +func http2configureTransports(t1 *Transport) (*http2Transport, error) { connPool := new(http2clientConnPool) t2 := &http2Transport{ ConnPool: http2noDialClientConnPool{connPool}, @@ -7192,6 +7201,7 @@ func (t *http2Transport) newClientConn(c net.Conn, singleUse bool) (*http2Client cc.inflow.add(http2transportDefaultConnFlow + http2initialWindowSize) cc.bw.Flush() if cc.werr != nil { + cc.Close() return nil, cc.werr } @@ -7583,6 +7593,15 @@ func (cc *http2ClientConn) roundTrip(req *Request) (res *Response, gotErrAfterRe bodyWriter := cc.t.getBodyWriterState(cs, body) cs.on100 = bodyWriter.on100 + defer func() { + cc.wmu.Lock() + werr := cc.werr + cc.wmu.Unlock() + if werr != nil { + cc.Close() + } + }() + cc.wmu.Lock() endStream := !hasBody && !hasTrailers werr := cc.writeHeaders(cs.ID, endStream, int(cc.maxFrameSize), hdrs) diff --git a/src/net/http/omithttp2.go b/src/net/http/omithttp2.go index c8f5c28a59..30c6e48cfc 100644 --- a/src/net/http/omithttp2.go +++ b/src/net/http/omithttp2.go @@ -45,7 +45,7 @@ type http2clientConnPool struct { conns map[string][]struct{} } -func http2configureTransport(*Transport) (*http2Transport, error) { panic(noHTTP2) } +func http2configureTransports(*Transport) (*http2Transport, error) { panic(noHTTP2) } func http2isNoCachedConnError(err error) bool { _, ok := err.(interface{ IsHTTP2NoCachedConnError() }) diff --git a/src/net/http/transport.go b/src/net/http/transport.go index 65ba664415..79b1fc7681 100644 --- a/src/net/http/transport.go +++ b/src/net/http/transport.go @@ -395,7 +395,7 @@ func (t *Transport) onceSetNextProtoDefaults() { if omitBundledHTTP2 { return } - t2, err := http2configureTransport(t) + t2, err := http2configureTransports(t) if err != nil { log.Printf("Error enabling Transport HTTP/2 support: %v", err) return @@ -1727,7 +1727,7 @@ func (t *Transport) dialConn(ctx context.Context, cm connectMethod) (pconn *pers if next, ok := t.TLSNextProto[s.NegotiatedProtocol]; ok { alt := next(cm.targetAddr, pconn.conn.(*tls.Conn)) if e, ok := alt.(erringRoundTripper); ok { - // pconn.conn was closed by next (http2configureTransport.upgradeFn). + // pconn.conn was closed by next (http2configureTransports.upgradeFn). return nil, e.RoundTripErr() } return &persistConn{t: t, cacheKey: pconn.cacheKey, alt: alt}, nil |
