diff --git a/transport/control.go b/transport/control.go index 63194830..0474b090 100644 --- a/transport/control.go +++ b/transport/control.go @@ -116,6 +116,7 @@ type goAway struct { func (*goAway) item() {} type flushIO struct { + closeTr bool } func (*flushIO) item() {} diff --git a/transport/http2_server.go b/transport/http2_server.go index 4a95363c..ce2ee4c8 100644 --- a/transport/http2_server.go +++ b/transport/http2_server.go @@ -1107,7 +1107,13 @@ func (t *http2Server) itemHandler(i item) error { }() return nil case *flushIO: - return t.framer.writer.Flush() + if err := t.framer.writer.Flush(); err != nil { + return err + } + if i.closeTr { + t.Close() + } + return nil case *ping: if !i.ack { t.bdpEst.timesnap(i.data) @@ -1155,7 +1161,7 @@ func (t *http2Server) closeStream(s *Stream) { t.idle = time.Now() } if t.state == draining && len(t.activeStreams) == 0 { - defer t.Close() + defer t.controlBuf.put(&flushIO{closeTr: true}) } t.mu.Unlock() // In case stream sending and receiving are invoked in separate