mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-22 23:07:59 +01:00
rpc: Add "jsonrpc" field and drop null "result"/"error" fields
Only for JSON-RPC 2.0 requests.
This commit is contained in:
parent
2ca1460ae3
commit
466b90562f
6 changed files with 28 additions and 18 deletions
|
@ -302,7 +302,7 @@ public:
|
|||
}
|
||||
addresses.pushKV("total", total);
|
||||
result.pushKV("addresses_known", addresses);
|
||||
return JSONRPCReplyObj(std::move(result), NullUniValue, 1);
|
||||
return JSONRPCReplyObj(std::move(result), NullUniValue, /*id=*/1, JSONRPCVersion::V1_LEGACY);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -371,7 +371,7 @@ public:
|
|||
}
|
||||
result.pushKV("relayfee", batch[ID_NETWORKINFO]["result"]["relayfee"]);
|
||||
result.pushKV("warnings", batch[ID_NETWORKINFO]["result"]["warnings"]);
|
||||
return JSONRPCReplyObj(std::move(result), NullUniValue, 1);
|
||||
return JSONRPCReplyObj(std::move(result), NullUniValue, /*id=*/1, JSONRPCVersion::V1_LEGACY);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -623,7 +623,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
return JSONRPCReplyObj(UniValue{result}, NullUniValue, 1);
|
||||
return JSONRPCReplyObj(UniValue{result}, NullUniValue, /*id=*/1, JSONRPCVersion::V1_LEGACY);
|
||||
}
|
||||
|
||||
const std::string m_help_doc{
|
||||
|
@ -709,7 +709,7 @@ public:
|
|||
UniValue result(UniValue::VOBJ);
|
||||
result.pushKV("address", address_str);
|
||||
result.pushKV("blocks", reply.get_obj()["result"]);
|
||||
return JSONRPCReplyObj(std::move(result), NullUniValue, 1);
|
||||
return JSONRPCReplyObj(std::move(result), NullUniValue, /*id=*/1, JSONRPCVersion::V1_LEGACY);
|
||||
}
|
||||
protected:
|
||||
std::string address_str;
|
||||
|
|
|
@ -73,7 +73,7 @@ static std::vector<std::vector<std::string>> g_rpcauth;
|
|||
static std::map<std::string, std::set<std::string>> g_rpc_whitelist;
|
||||
static bool g_rpc_whitelist_default = false;
|
||||
|
||||
static void JSONErrorReply(HTTPRequest* req, UniValue objError, UniValue id)
|
||||
static void JSONErrorReply(HTTPRequest* req, UniValue objError, const JSONRPCRequest& jreq)
|
||||
{
|
||||
// Send error reply from json-rpc error object
|
||||
int nStatus = HTTP_INTERNAL_SERVER_ERROR;
|
||||
|
@ -84,7 +84,7 @@ static void JSONErrorReply(HTTPRequest* req, UniValue objError, UniValue id)
|
|||
else if (code == RPC_METHOD_NOT_FOUND)
|
||||
nStatus = HTTP_NOT_FOUND;
|
||||
|
||||
std::string strReply = JSONRPCReplyObj(NullUniValue, std::move(objError), std::move(id)).write() + "\n";
|
||||
std::string strReply = JSONRPCReplyObj(NullUniValue, std::move(objError), jreq.id, jreq.m_json_version).write() + "\n";
|
||||
|
||||
req->WriteHeader("Content-Type", "application/json");
|
||||
req->WriteReply(nStatus, strReply);
|
||||
|
@ -231,9 +231,9 @@ static bool HTTPReq_JSONRPC(const std::any& context, HTTPRequest* req)
|
|||
jreq.parse(valRequest[i]);
|
||||
reply.push_back(JSONRPCExec(jreq));
|
||||
} catch (UniValue& e) {
|
||||
reply.push_back(JSONRPCReplyObj(NullUniValue, std::move(e), jreq.id));
|
||||
reply.push_back(JSONRPCReplyObj(NullUniValue, std::move(e), jreq.id, jreq.m_json_version));
|
||||
} catch (const std::exception& e) {
|
||||
reply.push_back(JSONRPCReplyObj(NullUniValue, JSONRPCError(RPC_PARSE_ERROR, e.what()), jreq.id));
|
||||
reply.push_back(JSONRPCReplyObj(NullUniValue, JSONRPCError(RPC_PARSE_ERROR, e.what()), jreq.id, jreq.m_json_version));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -243,10 +243,10 @@ static bool HTTPReq_JSONRPC(const std::any& context, HTTPRequest* req)
|
|||
req->WriteHeader("Content-Type", "application/json");
|
||||
req->WriteReply(HTTP_OK, reply.write() + "\n");
|
||||
} catch (UniValue& e) {
|
||||
JSONErrorReply(req, std::move(e), jreq.id);
|
||||
JSONErrorReply(req, std::move(e), jreq);
|
||||
return false;
|
||||
} catch (const std::exception& e) {
|
||||
JSONErrorReply(req, JSONRPCError(RPC_PARSE_ERROR, e.what()), jreq.id);
|
||||
JSONErrorReply(req, JSONRPCError(RPC_PARSE_ERROR, e.what()), jreq);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
|
|
@ -37,14 +37,21 @@ UniValue JSONRPCRequestObj(const std::string& strMethod, const UniValue& params,
|
|||
return request;
|
||||
}
|
||||
|
||||
UniValue JSONRPCReplyObj(UniValue result, UniValue error, UniValue id)
|
||||
UniValue JSONRPCReplyObj(UniValue result, UniValue error, UniValue id, JSONRPCVersion jsonrpc_version)
|
||||
{
|
||||
UniValue reply(UniValue::VOBJ);
|
||||
if (!error.isNull())
|
||||
reply.pushKV("result", NullUniValue);
|
||||
else
|
||||
// Add JSON-RPC version number field in v2 only.
|
||||
if (jsonrpc_version == JSONRPCVersion::V2) reply.pushKV("jsonrpc", "2.0");
|
||||
|
||||
// Add both result and error fields in v1, even though one will be null.
|
||||
// Omit the null field in v2.
|
||||
if (error.isNull()) {
|
||||
reply.pushKV("result", std::move(result));
|
||||
if (jsonrpc_version == JSONRPCVersion::V1_LEGACY) reply.pushKV("error", NullUniValue);
|
||||
} else {
|
||||
if (jsonrpc_version == JSONRPCVersion::V1_LEGACY) reply.pushKV("result", NullUniValue);
|
||||
reply.pushKV("error", std::move(error));
|
||||
}
|
||||
reply.pushKV("id", std::move(id));
|
||||
return reply;
|
||||
}
|
||||
|
|
|
@ -17,7 +17,7 @@ enum class JSONRPCVersion {
|
|||
};
|
||||
|
||||
UniValue JSONRPCRequestObj(const std::string& strMethod, const UniValue& params, const UniValue& id);
|
||||
UniValue JSONRPCReplyObj(UniValue result, UniValue error, UniValue id);
|
||||
UniValue JSONRPCReplyObj(UniValue result, UniValue error, UniValue id, JSONRPCVersion jsonrpc_version);
|
||||
UniValue JSONRPCError(int code, const std::string& message);
|
||||
|
||||
/** Generate a new RPC authentication cookie and write it to disk */
|
||||
|
|
|
@ -364,7 +364,7 @@ UniValue JSONRPCExec(const JSONRPCRequest& jreq)
|
|||
// but inside a batch, we just include the error object and return HTTP 200
|
||||
UniValue result = tableRPC.execute(jreq);
|
||||
|
||||
return JSONRPCReplyObj(std::move(result), NullUniValue, jreq.id);
|
||||
return JSONRPCReplyObj(std::move(result), NullUniValue, jreq.id, jreq.m_json_version);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -48,6 +48,9 @@ def format_request(options, idx, fields):
|
|||
def format_response(options, idx, fields):
|
||||
response = {}
|
||||
response.update(id=None if options.notification else idx)
|
||||
if options.version == 2:
|
||||
response.update(jsonrpc="2.0")
|
||||
else:
|
||||
response.update(result=None, error=None)
|
||||
response.update(fields)
|
||||
if options.response_fields:
|
||||
|
|
Loading…
Add table
Reference in a new issue