diff options
author | Brad Fitzpatrick <bradfitz@golang.org> | 2016-01-13 22:14:40 +0000 |
---|---|---|
committer | Brad Fitzpatrick <bradfitz@golang.org> | 2016-01-13 22:27:38 +0000 |
commit | 608ddc38bdaed0791979145947d7c08738b5f2a2 (patch) | |
tree | 62bdccbf10d4a02754e858df68141c3e8079a09b | |
parent | aba6250250d0cdcd1b7a19ca9c6112639eccbb5e (diff) | |
download | go-608ddc38bdaed0791979145947d7c08738b5f2a2.tar.gz go-608ddc38bdaed0791979145947d7c08738b5f2a2.zip |
net/http: update bundled http2
Updates x/net/http2 to git rev 341cd08 for https://golang.org/cl/18576
Change-Id: If5dcb60ac449b798c34fe332ede5ec74e66eb9db
Reviewed-on: https://go-review.googlesource.com/18579
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
-rw-r--r-- | src/net/http/h2_bundle.go | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/src/net/http/h2_bundle.go b/src/net/http/h2_bundle.go index 34b94798ab..7aae52eabc 100644 --- a/src/net/http/h2_bundle.go +++ b/src/net/http/h2_bundle.go @@ -5353,21 +5353,36 @@ func (rl *http2clientConnReadLoop) processData(f *http2DataFrame) error { cc := rl.cc cs := cc.streamByID(f.StreamID, f.StreamEnded()) if cs == nil { + cc.mu.Lock() + neverSent := cc.nextStreamID + cc.mu.Unlock() + if f.StreamID >= neverSent { + + cc.logf("http2: Transport received unsolicited DATA frame; closing connection") + return http2ConnectionError(http2ErrCodeProtocol) + } + return nil } - data := f.Data() + if data := f.Data(); len(data) > 0 { + if cs.bufPipe.b == nil { - cc.mu.Lock() - if cs.inflow.available() >= int32(len(data)) { - cs.inflow.take(int32(len(data))) - } else { + cc.logf("http2: Transport received DATA frame for closed stream; closing connection") + return http2ConnectionError(http2ErrCodeProtocol) + } + + cc.mu.Lock() + if cs.inflow.available() >= int32(len(data)) { + cs.inflow.take(int32(len(data))) + } else { + cc.mu.Unlock() + return http2ConnectionError(http2ErrCodeFlowControl) + } cc.mu.Unlock() - return http2ConnectionError(http2ErrCodeFlowControl) - } - cc.mu.Unlock() - if _, err := cs.bufPipe.Write(data); err != nil { - return err + if _, err := cs.bufPipe.Write(data); err != nil { + return err + } } if f.StreamEnded() { |