func newLazyCallReq()

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
}