Fix malformed output format over ws rpc (#426)

Fixes #405
This commit is contained in:
Alex Kremer
2022-12-07 19:20:21 +00:00
committed by GitHub
parent 8a1f00debb
commit 866b1d32b3
4 changed files with 20 additions and 21 deletions

View File

@@ -321,9 +321,6 @@ buildResponse(Context const& ctx)
if (!res)
return Status{RippledError::rpcFAILED_TO_FORWARD};
if (res->contains("result") && res->at("result").is_object())
return res->at("result").as_object();
return *res;
}

View File

@@ -50,17 +50,12 @@ doAccountInfo(Context const& context)
if (!accountID)
return Status{RippledError::rpcACT_MALFORMED};
assert(accountID.has_value());
auto key = ripple::keylet::account(accountID.value());
std::optional<std::vector<unsigned char>> dbResponse =
context.backend->fetchLedgerObject(key.key, lgrInfo.seq, context.yield);
if (!dbResponse)
{
return Status{RippledError::rpcACT_NOT_FOUND};
}
ripple::STLedgerEntry sle{
ripple::SerialIter{dbResponse->data(), dbResponse->size()}, key.key};
@@ -68,12 +63,6 @@ doAccountInfo(Context const& context)
if (!key.check(sle))
return Status{RippledError::rpcDB_DESERIALIZATION};
// if (!binary)
// response[JS(account_data)] = getJson(sle);
// else
// response[JS(account_data)] = ripple::strHex(*dbResponse);
// response[JS(db_time)] = time;
response[JS(account_data)] = toJson(sle);
response[JS(ledger_hash)] = ripple::strHex(lgrInfo.hash);
response[JS(ledger_index)] = lgrInfo.seq;

View File

@@ -417,9 +417,7 @@ handle_request(
boost::json::serialize(
RPC::makeError(RPC::RippledError::rpcBAD_SYNTAX))));
boost::json::object response{{"result", boost::json::object{}}};
boost::json::object& result = response["result"].as_object();
boost::json::object response;
auto start = std::chrono::system_clock::now();
auto v = RPC::buildResponse(*context);
auto end = std::chrono::system_clock::now();
@@ -432,7 +430,7 @@ handle_request(
counters.rpcErrored(context->method);
auto error = RPC::makeError(*status);
error["request"] = request;
result = error;
response["result"] = error;
perfLog.debug()
<< http->tag() << "Encountered error: " << responseStr;
@@ -443,10 +441,15 @@ handle_request(
// requests as successful.
counters.rpcComplete(context->method, us);
result = std::get<boost::json::object>(v);
auto result = std::get<boost::json::object>(v);
if (result.contains("result") && result.at("result").is_object())
result = result.at("result").as_object();
if (!result.contains("error"))
result["status"] = "success";
response["result"] = result;
}
boost::json::array warnings;

View File

@@ -39,7 +39,6 @@ getDefaultWsResponse(boost::json::value const& id)
if (!id.is_null())
defaultResp["id"] = id;
defaultResp["result"] = boost::json::object_kind;
defaultResp["status"] = "success";
defaultResp["type"] = "response";
@@ -348,7 +347,18 @@ public:
{
counters_.rpcComplete(context->method, us);
response["result"] = std::get<boost::json::object>(v);
auto const& result = std::get<boost::json::object>(v);
auto const isForwarded = result.contains("forwarded") &&
result.at("forwarded").is_bool() &&
result.at("forwarded").as_bool();
// if the result is forwarded - just use it as is
// but keep all default fields in the response too.
if (isForwarded)
for (auto const& [k, v] : result)
response.insert_or_assign(k, v);
else
response["result"] = result;
}
}
catch (std::exception const& e)