Merge pull request #401 from iamqizhao/master

some cleanup
diff --git a/rpc_util.go b/rpc_util.go
index f7d0ea5..5394034 100644
--- a/rpc_util.go
+++ b/rpc_util.go
@@ -128,19 +128,14 @@
 	s io.Reader
 }
 
-// msgFixedHeader defines the header of a gRPC message. Find more detail
-// at http://www.grpc.io/docs/guides/wire.html.
-type msgFixedHeader struct {
-	T      payloadFormat
-	Length uint32
-}
-
 // recvMsg is to read a complete gRPC message from the stream. It is blocking if
 // the message has not been complete yet. It returns the message and its type,
 // EOF is returned with nil msg and 0 pf if the entire stream is done. Other
 // non-nil error is returned if something is wrong on reading.
 func (p *parser) recvMsg() (pf payloadFormat, msg []byte, err error) {
-	var buf [5]byte // see msgFixedHeader
+	// The header of a gRPC message. Find more detail
+	// at http://www.grpc.io/docs/guides/wire.html.
+	var buf [5]byte
 
 	if _, err := io.ReadFull(p.s, buf[:]); err != nil {
 		return 0, nil, err
@@ -169,7 +164,7 @@
 	// Write message into the fixed header.
 	buf.WriteByte(uint8(pf))
 	var b []byte
-	var length int
+	var length uint32
 	if msg != nil {
 		var err error
 		// TODO(zhaoq): optimize to reduce memory alloc and copying.
@@ -177,13 +172,13 @@
 		if err != nil {
 			return nil, err
 		}
-		length = len(b)
+		length = uint32(len(b))
 	}
 	if length > math.MaxUint32 {
 		return nil, Errorf(codes.InvalidArgument, "grpc: message too large (%d bytes)", length)
 	}
 	var szHdr [4]byte
-	binary.BigEndian.PutUint32(szHdr[:], uint32(length))
+	binary.BigEndian.PutUint32(szHdr[:], length)
 	buf.Write(szHdr[:])
 	buf.Write(b)
 	return buf.Bytes(), nil
@@ -258,6 +253,8 @@
 // toRPCErr converts an error into a rpcError.
 func toRPCErr(err error) error {
 	switch e := err.(type) {
+	case rpcError:
+		return err
 	case transport.StreamError:
 		return rpcError{
 			code: e.Code,