]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: update bundled http2
authorBrad Fitzpatrick <bradfitz@golang.org>
Thu, 29 Jun 2017 00:10:57 +0000 (00:10 +0000)
committerBrad Fitzpatrick <bradfitz@golang.org>
Thu, 29 Jun 2017 03:26:16 +0000 (03:26 +0000)
Updates http2 to x/net/http2 git rev d4223d6710a for:

    http2: refund connection flow control on DATA frames received after reset
    https://golang.org/cl/46591

Fixes #46591

Change-Id: I5e6999599e921fed279c6d29ae77439191e99615
Reviewed-on: https://go-review.googlesource.com/47096
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Tom Bergan <tombergan@google.com>
src/net/http/h2_bundle.go

index 9ef24ab6cc559297198bae465c164ad63b8293c6..83f1671a5d08d6a4664494de5b7b34cd73f14c2b 100644 (file)
@@ -8232,16 +8232,27 @@ func (rl *http2clientConnReadLoop) processData(f *http2DataFrame) error {
                }
                // Return any padded flow control now, since we won't
                // refund it later on body reads.
-               if pad := int32(f.Length) - int32(len(data)); pad > 0 {
-                       cs.inflow.add(pad)
-                       cc.inflow.add(pad)
+               var refund int
+               if pad := int(f.Length) - len(data); pad > 0 {
+                       refund += pad
+               }
+               // Return len(data) now if the stream is already closed,
+               // since data will never be read.
+               didReset := cs.didReset
+               if didReset {
+                       refund += len(data)
+               }
+               if refund > 0 {
+                       cc.inflow.add(int32(refund))
                        cc.wmu.Lock()
-                       cc.fr.WriteWindowUpdate(0, uint32(pad))
-                       cc.fr.WriteWindowUpdate(cs.ID, uint32(pad))
+                       cc.fr.WriteWindowUpdate(0, uint32(refund))
+                       if !didReset {
+                               cs.inflow.add(int32(refund))
+                               cc.fr.WriteWindowUpdate(cs.ID, uint32(refund))
+                       }
                        cc.bw.Flush()
                        cc.wmu.Unlock()
                }
-               didReset := cs.didReset
                cc.mu.Unlock()
 
                if len(data) > 0 && !didReset {