Commit 09bb6434 authored by Brad Fitzpatrick's avatar Brad Fitzpatrick

net/http: update bundled http2

Update bundled x/net/http2 to x/net git rev 6c4ac8bd for:

   http2: fix Transport race sending RST_STREAM while reading DATA on cancels
   https://golang.org/cl/32571

   http2: remove h2-14 ALPN proto
   https://golang.org/cl/32576

Fixes #16974

Change-Id: I6ff8493a13d2641499fedf33e8005004735352ff
Reviewed-on: https://go-review.googlesource.com/32578
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
parent 2d3cd51d
...@@ -3035,8 +3035,6 @@ func http2ConfigureServer(s *Server, conf *http2Server) error { ...@@ -3035,8 +3035,6 @@ func http2ConfigureServer(s *Server, conf *http2Server) error {
s.TLSConfig.NextProtos = append(s.TLSConfig.NextProtos, http2NextProtoTLS) s.TLSConfig.NextProtos = append(s.TLSConfig.NextProtos, http2NextProtoTLS)
} }
s.TLSConfig.NextProtos = append(s.TLSConfig.NextProtos, "h2-14")
if s.TLSNextProto == nil { if s.TLSNextProto == nil {
s.TLSNextProto = map[string]func(*Server, *tls.Conn, Handler){} s.TLSNextProto = map[string]func(*Server, *tls.Conn, Handler){}
} }
...@@ -3050,7 +3048,6 @@ func http2ConfigureServer(s *Server, conf *http2Server) error { ...@@ -3050,7 +3048,6 @@ func http2ConfigureServer(s *Server, conf *http2Server) error {
}) })
} }
s.TLSNextProto[http2NextProtoTLS] = protoHandler s.TLSNextProto[http2NextProtoTLS] = protoHandler
s.TLSNextProto["h2-14"] = protoHandler
return nil return nil
} }
...@@ -5474,6 +5471,7 @@ type http2clientStream struct { ...@@ -5474,6 +5471,7 @@ type http2clientStream struct {
bytesRemain int64 // -1 means unknown; owned by transportResponseBody.Read bytesRemain int64 // -1 means unknown; owned by transportResponseBody.Read
readErr error // sticky read error; owned by transportResponseBody.Read readErr error // sticky read error; owned by transportResponseBody.Read
stopReqBody error // if non-nil, stop writing req body; guarded by cc.mu stopReqBody error // if non-nil, stop writing req body; guarded by cc.mu
didReset bool // whether we sent a RST_STREAM to the server; guarded by cc.mu
peerReset chan struct{} // closed on peer reset peerReset chan struct{} // closed on peer reset
resetErr error // populated before peerReset is closed resetErr error // populated before peerReset is closed
...@@ -5501,15 +5499,26 @@ func (cs *http2clientStream) awaitRequestCancel(req *Request) { ...@@ -5501,15 +5499,26 @@ func (cs *http2clientStream) awaitRequestCancel(req *Request) {
} }
select { select {
case <-req.Cancel: case <-req.Cancel:
cs.cancelStream()
cs.bufPipe.CloseWithError(http2errRequestCanceled) cs.bufPipe.CloseWithError(http2errRequestCanceled)
cs.cc.writeStreamReset(cs.ID, http2ErrCodeCancel, nil)
case <-ctx.Done(): case <-ctx.Done():
cs.cancelStream()
cs.bufPipe.CloseWithError(ctx.Err()) cs.bufPipe.CloseWithError(ctx.Err())
cs.cc.writeStreamReset(cs.ID, http2ErrCodeCancel, nil)
case <-cs.done: case <-cs.done:
} }
} }
func (cs *http2clientStream) cancelStream() {
cs.cc.mu.Lock()
didReset := cs.didReset
cs.didReset = true
cs.cc.mu.Unlock()
if !didReset {
cs.cc.writeStreamReset(cs.ID, http2ErrCodeCancel, nil)
}
}
// checkResetOrDone reports any error sent in a RST_STREAM frame by the // checkResetOrDone reports any error sent in a RST_STREAM frame by the
// server, or errStreamClosed if the stream is complete. // server, or errStreamClosed if the stream is complete.
func (cs *http2clientStream) checkResetOrDone() error { func (cs *http2clientStream) checkResetOrDone() error {
...@@ -6853,9 +6862,10 @@ func (rl *http2clientConnReadLoop) processData(f *http2DataFrame) error { ...@@ -6853,9 +6862,10 @@ func (rl *http2clientConnReadLoop) processData(f *http2DataFrame) error {
cc.bw.Flush() cc.bw.Flush()
cc.wmu.Unlock() cc.wmu.Unlock()
} }
didReset := cs.didReset
cc.mu.Unlock() cc.mu.Unlock()
if len(data) > 0 { if len(data) > 0 && !didReset {
if _, err := cs.bufPipe.Write(data); err != nil { if _, err := cs.bufPipe.Write(data); err != nil {
rl.endStreamError(cs, err) rl.endStreamError(cs, err)
return err return err
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment