in proxy/protocol/dubbo/dubbo/codec.go [159:223]
func (p *DubboCodec) DecodeDubboRspBody(buffer *util.ReadBuffer, rsp *DubboRsp) int {
var obj interface{}
var err error
if rsp.IsHeartbeat() {
rsp.SetValue(HeartBeatEvent)
}
if rsp.GetStatus() != Ok {
obj, err = buffer.ReadObject()
if err != nil {
rsp.SetErrorMsg(err.Error())
return 0
}
if s, ok := obj.(string); !ok {
rsp.SetErrorMsg("unknown error")
} else {
rsp.SetErrorMsg(s)
}
return 0
}
switch rsp.IsHeartbeat() {
case true:
//decodeHeartbeatData
obj, err = buffer.ReadObject()
if err != nil {
rsp.SetStatus(ServerError)
rsp.SetErrorMsg(err.Error())
return 0
}
case false:
//decodeResult
valueType, err := buffer.ReadByte()
if err != nil {
rsp.SetStatus(ServerError)
rsp.SetErrorMsg(err.Error())
return 0
}
switch valueType {
case ResponseNullValue:
//do nothing
rsp.SetValue(nil)
return 0
case ResponseValue:
obj, err = buffer.ReadObject()
if err != nil {
rsp.SetStatus(ServerError)
rsp.SetErrorMsg(err.Error())
return -1
}
case ResponseWithException:
//readObject,设置异常
rsp.SetStatus(ServiceError)
obj, err = buffer.ReadObject()
if err != nil {
rsp.SetStatus(ServerError)
rsp.SetErrorMsg(err.Error())
return 0
}
}
rsp.SetValue(buffer.GetBuf())
}
return 0
}