in internal/remote/codec.go [415:512]
func (c *rmqCodec) decodeHeader(data []byte) (*RemotingCommand, error) {
var err error
command := &RemotingCommand{}
buf := bytes.NewBuffer(data)
var code int16
err = binary.Read(buf, binary.BigEndian, &code)
if err != nil {
return nil, err
}
command.Code = code
var (
languageCode byte
remarkLen int32
extFieldsLen int32
)
err = binary.Read(buf, binary.BigEndian, &languageCode)
if err != nil {
return nil, err
}
command.Language = LanguageCode(languageCode)
var version int16
err = binary.Read(buf, binary.BigEndian, &version)
if err != nil {
return nil, err
}
command.Version = version
// int opaque
err = binary.Read(buf, binary.BigEndian, &command.Opaque)
if err != nil {
return nil, err
}
// int flag
err = binary.Read(buf, binary.BigEndian, &command.Flag)
if err != nil {
return nil, err
}
// String remark
err = binary.Read(buf, binary.BigEndian, &remarkLen)
if err != nil {
return nil, err
}
if remarkLen > 0 {
var remarkData = make([]byte, remarkLen)
if _, err = io.ReadFull(buf, remarkData); err != nil {
return nil, err
}
command.Remark = string(remarkData)
}
err = binary.Read(buf, binary.BigEndian, &extFieldsLen)
if err != nil {
return nil, err
}
if extFieldsLen > 0 {
extFieldsData := make([]byte, extFieldsLen)
if _, err := io.ReadFull(buf, extFieldsData); err != nil {
return nil, err
}
command.ExtFields = make(map[string]string)
buf := bytes.NewBuffer(extFieldsData)
var (
kLen int16
vLen int32
)
for buf.Len() > 0 {
err = binary.Read(buf, binary.BigEndian, &kLen)
if err != nil {
return nil, err
}
key, err := getExtFieldsData(buf, int32(kLen))
if err != nil {
return nil, err
}
err = binary.Read(buf, binary.BigEndian, &vLen)
if err != nil {
return nil, err
}
value, err := getExtFieldsData(buf, vLen)
if err != nil {
return nil, err
}
command.ExtFields[key] = value
}
}
return command, nil
}