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
 			}