From 9b2081cd39613bef19f7680900e51c428687e5ea Mon Sep 17 00:00:00 2001 From: Jakub Martin Date: Thu, 28 Jul 2016 17:01:34 +0200 Subject: [PATCH 1/4] Handling EOF when reading frame. --- transport/http2_server.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/transport/http2_server.go b/transport/http2_server.go index 38715c59..366398bb 100644 --- a/transport/http2_server.go +++ b/transport/http2_server.go @@ -239,6 +239,10 @@ func (t *http2Server) HandleStreams(handle func(*Stream)) { } frame, err := t.framer.readFrame() + if err == io.EOF || err == io.ErrUnexpectedEOF { + t.Close() + return + } if err != nil { grpclog.Printf("transport: http2Server.HandleStreams failed to read frame: %v", err) t.Close() @@ -265,6 +269,10 @@ func (t *http2Server) HandleStreams(handle func(*Stream)) { t.controlBuf.put(&resetStream{se.StreamID, se.Code}) continue } + if err == io.EOF || err == io.ErrUnexpectedEOF { + t.Close() + return + } grpclog.Printf("transport: http2Server.HandleStreams failed to read frame: %v", err) t.Close() return From 7967c495609fbc73d0ae44281ff3da95aa849347 Mon Sep 17 00:00:00 2001 From: Menghan Li Date: Thu, 28 Jul 2016 17:44:39 -0700 Subject: [PATCH 2/4] io.EOF should be an expected result of Write --- transport/transport_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/transport/transport_test.go b/transport/transport_test.go index f4af68b7..a1d7e39c 100644 --- a/transport/transport_test.go +++ b/transport/transport_test.go @@ -732,7 +732,7 @@ func TestEncodingRequiredStatus(t *testing.T) { Last: true, Delay: false, } - if err := ct.Write(s, expectedRequest, &opts); err != nil { + if err := ct.Write(s, expectedRequest, &opts); err != nil || err == io.EOF { t.Fatalf("Failed to write the request: %v", err) } p := make([]byte, http2MaxFrameLen) From 5bf353f41b8e1f75acfef8af77c7f5d7b8d8e278 Mon Sep 17 00:00:00 2001 From: Menghan Li Date: Fri, 22 Jul 2016 11:58:19 -0700 Subject: [PATCH 3/4] Prioritize ctx.Done() in wait() --- transport/transport.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/transport/transport.go b/transport/transport.go index 10b4a2e2..0aebf598 100644 --- a/transport/transport.go +++ b/transport/transport.go @@ -559,6 +559,12 @@ func wait(ctx context.Context, done, goAway, closing <-chan struct{}, proceed <- case <-closing: return 0, ErrConnClosing case i := <-proceed: + // User cancellation has precedence. + select { + case <-ctx.Done(): + return 0, ContextErr(ctx.Err()) + default: + } return i, nil } } From e8e6719e49fbfc88c4a8303ff93dde1847344758 Mon Sep 17 00:00:00 2001 From: Menghan Li Date: Fri, 22 Jul 2016 10:37:08 -0700 Subject: [PATCH 4/4] Add server.stop() to one transport test --- transport/transport_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/transport/transport_test.go b/transport/transport_test.go index a1d7e39c..a08376d3 100644 --- a/transport/transport_test.go +++ b/transport/transport_test.go @@ -553,6 +553,7 @@ func TestServerContextCanceledOnClosedConnection(t *testing.T) { case <-time.After(5 * time.Second): t.Fatalf("Failed to cancel the context of the sever side stream.") } + server.stop() } func TestServerWithMisbehavedClient(t *testing.T) {