nekoray_Mahdi-zarei/3rdparty/protorpc/rpc_client.cc
2025-08-16 22:24:04 +03:30

98 lines
2.2 KiB
C++

// Copyright 2013 <chaishushan{AT}gmail.com>. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
#include "3rdparty/protorpc/rpc_client.h"
#include "3rdparty/protorpc/rpc_wire.h"
namespace protorpc {
Client::Client(const char* host, int port):
conn_(0), host_(host), port_(port), seq_(0) {
//
}
Client::~Client() {
Close();
}
const ::protorpc::Error Client::CallMethod(
const std::string& method,
const ::std::string* request,
::std::string* response
) {
if(!checkMothdValid(method, request, response)) {
return ::protorpc::Error::New(
std::string("protorpc.Client.CallMethod: Invalid method, method: ") + method
);
}
return callMethod(method, request, response);
}
// Close the connection
void Client::Close() {
conn_.Close();
}
// --------------------------------------------------------
const ::protorpc::Error Client::callMethod(
const std::string& method,
const ::std::string* request,
::std::string* response
) {
if(!conn_.IsValid()) {
if(!conn_.DialTCP(host_.c_str(), port_)) {
return ::protorpc::Error::New(
std::string("protorpc.Client.callMethod: DialTCP fail, method ") + method + " ," +
std::string("host: ") + host_ + std::string(":") + std::to_string(static_cast<long long>(port_))
);
}
}
Error err;
uint64_t id = seq_++;
wire::ResponseHeader respHeader;
// send request
err = wire::SendRequest(&conn_, id, method, request);
if(!err.IsNil()) {
return err;
}
// recv response hdr
err = wire::RecvResponseHeader(&conn_, &respHeader);
if(!err.IsNil()) {
return err;
}
// recv response body
err = wire::RecvResponseBody(&conn_, &respHeader, response);
if(!err.IsNil()) {
return err;
}
if(respHeader.id != id) {
return Error::New("protorpc.Client.callMethod: unexpected call id.");
}
if(!respHeader.error.empty()) {
return Error::New(respHeader.error);
}
return Error::Nil();
}
// --------------------------------------------------------
bool Client::checkMothdValid(
const std::string& method,
const ::std::string* request,
::std::string* response
) const {
if(method.empty()) return false;
if(!request) return false;
if(!response) return false;
return true;
}
} // namespace protorpc