func (cdc *HrpcClientCodec) ReadResponseHeader(resp *rpc.Response) error { hdr := common.HrpcResponseHeader{} err := binary.Read(cdc.rwc, binary.LittleEndian, &hdr) if err != nil { return errors.New(fmt.Sprintf("Error reading response header "+ "bytes: %s", err.Error())) } resp.ServiceMethod = common.HrpcMethodIdToMethodName(hdr.MethodId) if resp.ServiceMethod == "" { return errors.New(fmt.Sprintf("Error reading response header: "+ "invalid method ID %d.", hdr.MethodId)) } resp.Seq = hdr.Seq if hdr.ErrLength > 0 { if hdr.ErrLength > common.MAX_HRPC_ERROR_LENGTH { return errors.New(fmt.Sprintf("Error reading response header: "+ "error message was %d bytes long, but "+ "MAX_HRPC_ERROR_LENGTH is %d.", hdr.ErrLength, common.MAX_HRPC_ERROR_LENGTH)) } buf := make([]byte, hdr.ErrLength) var nread int nread, err = cdc.rwc.Read(buf) if uint32(nread) != hdr.ErrLength { return errors.New(fmt.Sprintf("Error reading response header: "+ "failed to read %d bytes of error message.", nread)) } if err != nil { return errors.New(fmt.Sprintf("Error reading response header: "+ "failed to read %d bytes of error message: %s", nread, err.Error())) } resp.Error = string(buf) } else { resp.Error = "" } cdc.length = hdr.Length return nil }
func (cdc *HrpcServerCodec) ReadRequestHeader(req *rpc.Request) error { hdr := common.HrpcRequestHeader{} if cdc.lg.TraceEnabled() { cdc.lg.Tracef("%s: Reading HRPC request header.\n", cdc.conn.RemoteAddr()) } cdc.conn.SetDeadline(time.Now().Add(cdc.hsv.ioTimeo)) err := binary.Read(cdc.conn, binary.LittleEndian, &hdr) if err != nil { if err == io.EOF && cdc.numHandled > 0 { return newIoError(cdc, fmt.Sprintf("Remote closed connection "+ "after writing %d message(s)", cdc.numHandled), common.DEBUG) } return newIoError(cdc, fmt.Sprintf("Error reading request header: %s", err.Error()), common.WARN) } if cdc.lg.TraceEnabled() { cdc.lg.Tracef("%s: Read HRPC request header %s\n", cdc.conn.RemoteAddr(), asJson(&hdr)) } if hdr.Magic != common.HRPC_MAGIC { return newIoErrorWarn(cdc, fmt.Sprintf("Invalid request header: expected "+ "magic number of 0x%04x, but got 0x%04x", common.HRPC_MAGIC, hdr.Magic)) } if hdr.Length > common.MAX_HRPC_BODY_LENGTH { return newIoErrorWarn(cdc, fmt.Sprintf("Length prefix was too long. "+ "Maximum length is %d, but we got %d.", common.MAX_HRPC_BODY_LENGTH, hdr.Length)) } req.ServiceMethod = common.HrpcMethodIdToMethodName(hdr.MethodId) if req.ServiceMethod == "" { return newIoErrorWarn(cdc, fmt.Sprintf("Unknown MethodID code 0x%04x", hdr.MethodId)) } req.Seq = hdr.Seq cdc.length = hdr.Length return nil }
func (cdc *HrpcServerCodec) ReadRequestHeader(req *rpc.Request) error { hdr := common.HrpcRequestHeader{} if cdc.lg.TraceEnabled() { cdc.lg.Tracef("Reading HRPC request header from %s\n", cdc.conn.RemoteAddr()) } err := binary.Read(cdc.conn, binary.LittleEndian, &hdr) if err != nil { level := common.WARN if err == io.EOF { level = common.DEBUG } return createErrAndLog(cdc.lg, fmt.Sprintf("Error reading header bytes: %s", err.Error()), level) } if cdc.lg.TraceEnabled() { cdc.lg.Tracef("Read HRPC request header %s from %s\n", asJson(&hdr), cdc.conn.RemoteAddr()) } if hdr.Magic != common.HRPC_MAGIC { return createErrAndWarn(cdc.lg, fmt.Sprintf("Invalid request header: expected "+ "magic number of 0x%04x, but got 0x%04x", common.HRPC_MAGIC, hdr.Magic)) } if hdr.Length > common.MAX_HRPC_BODY_LENGTH { return createErrAndWarn(cdc.lg, fmt.Sprintf("Length prefix was too long. "+ "Maximum length is %d, but we got %d.", common.MAX_HRPC_BODY_LENGTH, hdr.Length)) } req.ServiceMethod = common.HrpcMethodIdToMethodName(hdr.MethodId) if req.ServiceMethod == "" { return createErrAndWarn(cdc.lg, fmt.Sprintf("Unknown MethodID code 0x%04x", hdr.MethodId)) } req.Seq = hdr.Seq cdc.length = hdr.Length return nil }