http2: complete outstanding async write before reading the next frame
For golang/go#42777
Change-Id: I8d7e35ded3fe508f6c285e84ba768104c3406bdf
Reviewed-on: https://go-review.googlesource.com/c/net/+/330909
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Damien Neil <dneil@google.com>
Trust: Dmitri Shuralyov <dmitshur@golang.org>
diff --git a/http2/server.go b/http2/server.go
index 07ac694..19e449c 100644
--- a/http2/server.go
+++ b/http2/server.go
@@ -856,6 +856,15 @@
case res := <-sc.wroteFrameCh:
sc.wroteFrame(res)
case res := <-sc.readFrameCh:
+ // Process any written frames before reading new frames from the client since a
+ // written frame could have triggered a new stream to be started.
+ if sc.writingFrameAsync {
+ select {
+ case wroteRes := <-sc.wroteFrameCh:
+ sc.wroteFrame(wroteRes)
+ default:
+ }
+ }
if !sc.processFrameFromReader(res) {
return
}