Merge pull request #2729

161401dd Fix JSON-RPC response object over ZMQ (Lee Clagett)
This commit is contained in:
Riccardo Spagni 2017-11-06 01:42:55 +02:00
commit 4022a0a57e
No known key found for this signature in database
GPG Key ID: 55432DF31CCD4FCD
1 changed files with 31 additions and 22 deletions

View File

@ -45,6 +45,15 @@ const char* Message::STATUS_FAILED = "Failed";
const char* Message::STATUS_BAD_REQUEST = "Invalid request type";
const char* Message::STATUS_BAD_JSON = "Malformed json";
namespace
{
constexpr const char error_field[] = "error";
constexpr const char id_field[] = "id";
constexpr const char method_field[] = "method";
constexpr const char params_field[] = "params";
constexpr const char result_field[] = "result";
}
rapidjson::Value Message::toJson(rapidjson::Document& doc) const
{
rapidjson::Value val(rapidjson::kObjectType);
@ -70,8 +79,8 @@ FullMessage::FullMessage(const std::string& request, Message* message)
{
doc.SetObject();
doc.AddMember("method", rapidjson::StringRef(request.c_str()), doc.GetAllocator());
doc.AddMember("params", message->toJson(doc), doc.GetAllocator());
doc.AddMember(method_field, rapidjson::StringRef(request.c_str()), doc.GetAllocator());
doc.AddMember(params_field, message->toJson(doc), doc.GetAllocator());
// required by JSON-RPC 2.0 spec
doc.AddMember("jsonrpc", rapidjson::Value("2.0"), doc.GetAllocator());
@ -86,7 +95,7 @@ FullMessage::FullMessage(Message* message)
if (message->status == Message::STATUS_OK)
{
doc.AddMember("response", message->toJson(doc), doc.GetAllocator());
doc.AddMember(result_field, message->toJson(doc), doc.GetAllocator());
}
else
{
@ -111,14 +120,14 @@ FullMessage::FullMessage(const std::string& json_string, bool request)
if (request)
{
OBJECT_HAS_MEMBER_OR_THROW(doc, "method")
OBJECT_HAS_MEMBER_OR_THROW(doc, "params")
OBJECT_HAS_MEMBER_OR_THROW(doc, method_field)
OBJECT_HAS_MEMBER_OR_THROW(doc, params_field)
}
else
{
if (!doc.HasMember("response") && !doc.HasMember("error"))
if (!doc.HasMember(result_field) && !doc.HasMember(error_field))
{
throw cryptonote::json::MISSING_KEY("error/response");
throw cryptonote::json::MISSING_KEY("error/result");
}
}
}
@ -126,9 +135,9 @@ FullMessage::FullMessage(const std::string& json_string, bool request)
std::string FullMessage::getJson()
{
if (!doc.HasMember("id"))
if (!doc.HasMember(id_field))
{
doc.AddMember("id", rapidjson::Value("unused"), doc.GetAllocator());
doc.AddMember(id_field, rapidjson::Value("unused"), doc.GetAllocator());
}
rapidjson::StringBuffer buf;
@ -142,24 +151,24 @@ std::string FullMessage::getJson()
std::string FullMessage::getRequestType() const
{
OBJECT_HAS_MEMBER_OR_THROW(doc, "method")
return doc["method"].GetString();
OBJECT_HAS_MEMBER_OR_THROW(doc, method_field)
return doc[method_field].GetString();
}
rapidjson::Value& FullMessage::getMessage()
{
if (doc.HasMember("params"))
if (doc.HasMember(params_field))
{
return doc["params"];
return doc[params_field];
}
else if (doc.HasMember("response"))
else if (doc.HasMember(result_field))
{
return doc["response"];
return doc[result_field];
}
//else
OBJECT_HAS_MEMBER_OR_THROW(doc, "error")
return doc["error"];
OBJECT_HAS_MEMBER_OR_THROW(doc, error_field)
return doc[error_field];
}
@ -172,20 +181,20 @@ rapidjson::Value FullMessage::getMessageCopy()
rapidjson::Value& FullMessage::getID()
{
OBJECT_HAS_MEMBER_OR_THROW(doc, "id")
return doc["id"];
OBJECT_HAS_MEMBER_OR_THROW(doc, id_field)
return doc[id_field];
}
void FullMessage::setID(rapidjson::Value& id)
{
auto itr = doc.FindMember("id");
auto itr = doc.FindMember(id_field);
if (itr != doc.MemberEnd())
{
itr->value = id;
}
else
{
doc.AddMember("id", id, doc.GetAllocator());
doc.AddMember(id_field, id, doc.GetAllocator());
}
}
@ -193,7 +202,7 @@ cryptonote::rpc::error FullMessage::getError()
{
cryptonote::rpc::error err;
err.use = false;
if (doc.HasMember("error"))
if (doc.HasMember(error_field))
{
GET_FROM_JSON_OBJECT(doc, err, error);
err.use = true;