in hessian.go [175:217]
func (h *HessianCodec) ReadBody(rspObj interface{}) error {
if h.reader.Buffered() < h.bodyLen {
return ErrBodyNotEnough
}
buf, err := h.reader.Peek(h.bodyLen)
if err != nil {
return perrors.WithStack(err)
}
_, err = h.reader.Discard(h.bodyLen)
if err != nil { // this is impossible
return perrors.WithStack(err)
}
switch h.pkgType & PackageType_BitSize {
case PackageResponse | PackageHeartbeat | PackageResponse_Exception, PackageResponse | PackageResponse_Exception:
decoder := NewDecoder(buf[:])
exception, decErr := decoder.Decode()
if decErr != nil {
return perrors.WithStack(decErr)
}
rsp, ok := rspObj.(*Response)
if !ok {
return perrors.Errorf("java exception:%s", exception.(string))
}
rsp.Exception = perrors.Errorf("java exception:%s", exception.(string))
return nil
case PackageRequest | PackageHeartbeat, PackageResponse | PackageHeartbeat:
case PackageRequest:
if rspObj != nil {
if err = unpackRequestBody(NewStrictDecoder(buf[:]), rspObj); err != nil {
return perrors.WithStack(err)
}
}
case PackageResponse:
if rspObj != nil {
if err = unpackResponseBody(NewDecoder(buf[:]), rspObj); err != nil {
return perrors.WithStack(err)
}
}
}
return nil
}