func()

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
}