in relay_messages.go [177:241]
func newLazyCallReq(f *Frame) (*lazyCallReq, error) {
if msgType := f.Header.messageType; msgType != messageTypeCallReq {
panic(fmt.Errorf("newLazyCallReq called for wrong messageType: %v", msgType))
}
cr := &lazyCallReq{Frame: f}
cr.arg2Appends = cr.arg2InitialBuf[:0]
rbuf := typed.NewReadBuffer(f.SizedPayload())
rbuf.SkipBytes(_serviceLenIndex)
// service~1
serviceLen := rbuf.ReadSingleByte()
rbuf.SkipBytes(int(serviceLen))
// nh:1 (hk~1 hv~1){nh}
numHeaders := int(rbuf.ReadSingleByte())
for i := 0; i < numHeaders; i++ {
keyLen := int(rbuf.ReadSingleByte())
key := rbuf.ReadBytes(keyLen)
valLen := int(rbuf.ReadSingleByte())
val := rbuf.ReadBytes(valLen)
if bytes.Equal(key, _argSchemeKeyBytes) {
cr.as = val
} else if bytes.Equal(key, _callerNameKeyBytes) {
cr.caller = val
} else if bytes.Equal(key, _routingDelegateKeyBytes) {
cr.delegate = val
} else if bytes.Equal(key, _routingKeyKeyBytes) {
cr.key = val
}
}
// csumtype:1 (csum:4){0,1} arg1~2 arg2~2 arg3~2
cr.checksumTypeOffset = uint16(rbuf.BytesRead())
cr.checksumType = ChecksumType(rbuf.ReadSingleByte())
rbuf.SkipBytes(cr.checksumType.ChecksumSize())
// arg1~2
arg1Len := int(rbuf.ReadUint16())
cr.method = rbuf.ReadBytes(arg1Len)
// arg2~2
arg2Len := rbuf.ReadUint16()
cr.arg2StartOffset = uint16(rbuf.BytesRead())
cr.arg2EndOffset = cr.arg2StartOffset + arg2Len
// arg2 is fragmented if we don't see arg3 in this frame.
rbuf.SkipBytes(int(arg2Len))
cr.isArg2Fragmented = rbuf.BytesRemaining() == 0 && cr.HasMoreFragments()
if !cr.isArg2Fragmented {
// arg3~2
rbuf.SkipBytes(2)
cr.arg3StartOffset = uint16(rbuf.BytesRead())
}
if rbuf.Err() != nil {
return nil, rbuf.Err()
}
return cr, nil
}