From: Brad Fitzpatrick Date: Thu, 29 Jun 2017 00:10:57 +0000 (+0000) Subject: net/http: update bundled http2 X-Git-Tag: go1.9rc1~129 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=070b82e2e8b28b067e08927228ee651dd54a4236;p=gostls13.git net/http: update bundled http2 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 TryBot-Result: Gobot Gobot Reviewed-by: Tom Bergan --- diff --git a/src/net/http/h2_bundle.go b/src/net/http/h2_bundle.go index 9ef24ab6cc..83f1671a5d 100644 --- a/src/net/http/h2_bundle.go +++ b/src/net/http/h2_bundle.go @@ -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 {