aboutsummaryrefslogtreecommitdiff
path: root/src/net/http
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/http')
-rw-r--r--src/net/http/export_test.go2
-rw-r--r--src/net/http/h2_bundle.go23
-rw-r--r--src/net/http/omithttp2.go2
-rw-r--r--src/net/http/transport.go4
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