diff --git a/call_test.go b/call_test.go index ad1c7508..53b4cfc9 100644 --- a/call_test.go +++ b/call_test.go @@ -50,6 +50,7 @@ import ( var ( expectedRequest = "ping" expectedResponse = "pong" + sizeLargeErr = 1024 * 1024 ) type testCodec struct { @@ -91,7 +92,8 @@ func (h *testStreamHandler) handleStream(t *testing.T, s *transport.Stream) { t.Fatalf("Failed to unmarshal the received message %v", err) } if v != expectedRequest { - t.Fatalf("handleStream got %v, want %v", v, expectedRequest) + h.t.WriteStatus(s, codes.Internal, string(make([]byte, sizeLargeErr))) + return } } // send a response back to end the stream. @@ -192,5 +194,21 @@ func TestInvoke(t *testing.T) { if err := Invoke(context.Background(), "/foo/bar", &expectedRequest, &reply, cc); err != nil || reply != expectedResponse { t.Fatalf("grpc.Invoke(_, _, _, _, _) = %v, want ", err) } + cc.Close() + server.stop() +} + +func TestInvokeLargeErr(t *testing.T) { + server, cc := setUp(t, 0, math.MaxUint32) + var reply string + req := "hello" + err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc) + if _, ok := err.(rpcError); !ok { + t.Fatalf("grpc.Invoke(_, _, _, _, _) receives non rpc error.") + } + if Code(err) != codes.Internal || len(ErrorDesc(err)) != sizeLargeErr { + t.Fatalf("grpc.Invoke(_, _, _, _, _) = %v, want an error of code %d and desc size %d", err, codes.Internal, sizeLargeErr) + } + cc.Close() server.stop() } diff --git a/transport/http2_client.go b/transport/http2_client.go index 9bbbb4d4..07b0c117 100644 --- a/transport/http2_client.go +++ b/transport/http2_client.go @@ -753,7 +753,7 @@ func (t *http2Client) reader() { endStream := frame.Header().Flags.Has(http2.FlagHeadersEndStream) curStream = t.operateHeaders(hDec, curStream, frame, endStream) case *http2.ContinuationFrame: - curStream = t.operateHeaders(hDec, curStream, frame, false) + curStream = t.operateHeaders(hDec, curStream, frame, frame.HeadersEnded()) case *http2.DataFrame: t.handleData(frame) case *http2.RSTStreamFrame: