19
rpc_util.go
19
rpc_util.go
@ -128,19 +128,14 @@ type parser struct {
|
||||
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 @@ func encode(c Codec, msg interface{}, pf payloadFormat) ([]byte, error) {
|
||||
// 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 @@ func encode(c Codec, msg interface{}, pf payloadFormat) ([]byte, error) {
|
||||
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 @@ func Errorf(c codes.Code, format string, a ...interface{}) error {
|
||||
// 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,
|
||||
|
Reference in New Issue
Block a user