Allow >16k status desc
diff --git a/call_test.go b/call_test.go
index ad1c750..53b4cfc 100644
--- a/call_test.go
+++ b/call_test.go
@@ -50,6 +50,7 @@
 var (
 	expectedRequest  = "ping"
 	expectedResponse = "pong"
+	sizeLargeErr     = 1024 * 1024
 )
 
 type testCodec struct {
@@ -91,7 +92,8 @@
 			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 @@
 	if err := Invoke(context.Background(), "/foo/bar", &expectedRequest, &reply, cc); err != nil || reply != expectedResponse {
 		t.Fatalf("grpc.Invoke(_, _, _, _, _) = %v, want <nil>", 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 9bbbb4d..07b0c11 100644
--- a/transport/http2_client.go
+++ b/transport/http2_client.go
@@ -753,7 +753,7 @@
 			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: