diff options
Diffstat (limited to 'vendor/golang.org/x/net')
| -rw-r--r-- | vendor/golang.org/x/net/http2/config.go | 2 | ||||
| -rw-r--r-- | vendor/golang.org/x/net/http2/config_go124.go | 2 | ||||
| -rw-r--r-- | vendor/golang.org/x/net/http2/transport.go | 13 | 
3 files changed, 12 insertions, 5 deletions
diff --git a/vendor/golang.org/x/net/http2/config.go b/vendor/golang.org/x/net/http2/config.go index de58dfb8d..ca645d9a1 100644 --- a/vendor/golang.org/x/net/http2/config.go +++ b/vendor/golang.org/x/net/http2/config.go @@ -60,7 +60,7 @@ func configFromServer(h1 *http.Server, h2 *Server) http2Config {  	return conf  } -// configFromServer merges configuration settings from h2 and h2.t1.HTTP2 +// configFromTransport merges configuration settings from h2 and h2.t1.HTTP2  // (the net/http Transport).  func configFromTransport(h2 *Transport) http2Config {  	conf := http2Config{ diff --git a/vendor/golang.org/x/net/http2/config_go124.go b/vendor/golang.org/x/net/http2/config_go124.go index e3784123c..5b516c55f 100644 --- a/vendor/golang.org/x/net/http2/config_go124.go +++ b/vendor/golang.org/x/net/http2/config_go124.go @@ -13,7 +13,7 @@ func fillNetHTTPServerConfig(conf *http2Config, srv *http.Server) {  	fillNetHTTPConfig(conf, srv.HTTP2)  } -// fillNetHTTPServerConfig sets fields in conf from tr.HTTP2. +// fillNetHTTPTransportConfig sets fields in conf from tr.HTTP2.  func fillNetHTTPTransportConfig(conf *http2Config, tr *http.Transport) {  	fillNetHTTPConfig(conf, tr.HTTP2)  } diff --git a/vendor/golang.org/x/net/http2/transport.go b/vendor/golang.org/x/net/http2/transport.go index 090d0e1bd..b2e2ed337 100644 --- a/vendor/golang.org/x/net/http2/transport.go +++ b/vendor/golang.org/x/net/http2/transport.go @@ -375,6 +375,7 @@ type ClientConn struct {  	doNotReuse       bool       // whether conn is marked to not be reused for any future requests  	closing          bool  	closed           bool +	closedOnIdle     bool                     // true if conn was closed for idleness  	seenSettings     bool                     // true if we've seen a settings frame, false otherwise  	seenSettingsChan chan struct{}            // closed when seenSettings is true or frame reading fails  	wantSettingsAck  bool                     // we sent a SETTINGS frame and haven't heard back @@ -1089,10 +1090,12 @@ func (cc *ClientConn) idleStateLocked() (st clientConnIdleState) {  	// If this connection has never been used for a request and is closed,  	// then let it take a request (which will fail). +	// If the conn was closed for idleness, we're racing the idle timer; +	// don't try to use the conn. (Issue #70515.)  	//  	// This avoids a situation where an error early in a connection's lifetime  	// goes unreported. -	if cc.nextStreamID == 1 && cc.streamsReserved == 0 && cc.closed { +	if cc.nextStreamID == 1 && cc.streamsReserved == 0 && cc.closed && !cc.closedOnIdle {  		st.canTakeNewRequest = true  	} @@ -1155,6 +1158,7 @@ func (cc *ClientConn) closeIfIdle() {  		return  	}  	cc.closed = true +	cc.closedOnIdle = true  	nextID := cc.nextStreamID  	// TODO: do clients send GOAWAY too? maybe? Just Close:  	cc.mu.Unlock() @@ -2434,9 +2438,12 @@ func (rl *clientConnReadLoop) cleanup() {  	// This avoids a situation where new connections are constantly created,  	// added to the pool, fail, and are removed from the pool, without any error  	// being surfaced to the user. -	const unusedWaitTime = 5 * time.Second +	unusedWaitTime := 5 * time.Second +	if cc.idleTimeout > 0 && unusedWaitTime > cc.idleTimeout { +		unusedWaitTime = cc.idleTimeout +	}  	idleTime := cc.t.now().Sub(cc.lastActive) -	if atomic.LoadUint32(&cc.atomicReused) == 0 && idleTime < unusedWaitTime { +	if atomic.LoadUint32(&cc.atomicReused) == 0 && idleTime < unusedWaitTime && !cc.closedOnIdle {  		cc.idleTimer = cc.t.afterFunc(unusedWaitTime-idleTime, func() {  			cc.t.connPool().MarkDead(cc)  		})  | 
