in hessian.go [110:172]
func (h *HessianCodec) ReadHeader(header *DubboHeader) error {
var err error
if h.reader.Size() < HEADER_LENGTH {
return ErrHeaderNotEnough
}
buf, err := h.reader.Peek(HEADER_LENGTH)
if err != nil { // this is impossible
return perrors.WithStack(err)
}
_, err = h.reader.Discard(HEADER_LENGTH)
if err != nil { // this is impossible
return perrors.WithStack(err)
}
//// read header
if buf[0] != MAGIC_HIGH && buf[1] != MAGIC_LOW {
return ErrIllegalPackage
}
// Header{serialization id(5 bit), event, two way, req/response}
if header.SerialID = buf[2] & SERIAL_MASK; header.SerialID == Zero {
return perrors.Errorf("serialization ID:%v", header.SerialID)
}
headerFlag := buf[2] & FLAG_EVENT
if headerFlag != Zero {
header.Type |= PackageHeartbeat
}
headerFlag = buf[2] & FLAG_REQUEST
if headerFlag != Zero {
header.Type |= PackageRequest
headerFlag = buf[2] & FLAG_TWOWAY
if headerFlag != Zero {
header.Type |= PackageRequest_TwoWay
}
} else {
header.Type |= PackageResponse
header.ResponseStatus = buf[3]
if header.ResponseStatus != Response_OK {
header.Type |= PackageResponse_Exception
}
}
// Header{req id}
header.ID = int64(binary.BigEndian.Uint64(buf[4:]))
// Header{body len}
header.BodyLen = int(binary.BigEndian.Uint32(buf[12:]))
if header.BodyLen < 0 {
return ErrIllegalPackage
}
h.pkgType = header.Type
h.bodyLen = header.BodyLen
if h.reader.Buffered() < h.bodyLen {
return ErrBodyNotEnough
}
return perrors.WithStack(err)
}