mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-12 06:58:57 +01:00
[REST] add JSON support for /rest/headers/
This commit is contained in:
19
src/rest.cpp
19
src/rest.cpp
@@ -65,6 +65,7 @@ public:
|
||||
extern void TxToJSON(const CTransaction& tx, const uint256 hashBlock, UniValue& entry);
|
||||
extern UniValue blockToJSON(const CBlock& block, const CBlockIndex* blockindex, bool txDetails = false);
|
||||
extern void ScriptPubKeyToJSON(const CScript& scriptPubKey, UniValue& out, bool fIncludeHex);
|
||||
extern UniValue blockheaderToJSON(const CBlockIndex* blockindex);
|
||||
|
||||
static RestErr RESTERR(enum HTTPStatusCode status, string message)
|
||||
{
|
||||
@@ -134,14 +135,14 @@ static bool rest_headers(AcceptedConnection* conn,
|
||||
if (!ParseHashStr(hashStr, hash))
|
||||
throw RESTERR(HTTP_BAD_REQUEST, "Invalid hash: " + hashStr);
|
||||
|
||||
std::vector<CBlockHeader> headers;
|
||||
std::vector<const CBlockIndex *> headers;
|
||||
headers.reserve(count);
|
||||
{
|
||||
LOCK(cs_main);
|
||||
BlockMap::const_iterator it = mapBlockIndex.find(hash);
|
||||
const CBlockIndex *pindex = (it != mapBlockIndex.end()) ? it->second : NULL;
|
||||
while (pindex != NULL && chainActive.Contains(pindex)) {
|
||||
headers.push_back(pindex->GetBlockHeader());
|
||||
headers.push_back(pindex);
|
||||
if (headers.size() == (unsigned long)count)
|
||||
break;
|
||||
pindex = chainActive.Next(pindex);
|
||||
@@ -149,8 +150,8 @@ static bool rest_headers(AcceptedConnection* conn,
|
||||
}
|
||||
|
||||
CDataStream ssHeader(SER_NETWORK, PROTOCOL_VERSION);
|
||||
BOOST_FOREACH(const CBlockHeader &header, headers) {
|
||||
ssHeader << header;
|
||||
BOOST_FOREACH(const CBlockIndex *pindex, headers) {
|
||||
ssHeader << pindex->GetBlockHeader();
|
||||
}
|
||||
|
||||
switch (rf) {
|
||||
@@ -166,6 +167,16 @@ static bool rest_headers(AcceptedConnection* conn,
|
||||
return true;
|
||||
}
|
||||
|
||||
case RF_JSON: {
|
||||
UniValue jsonHeaders(UniValue::VARR);
|
||||
BOOST_FOREACH(const CBlockIndex *pindex, headers) {
|
||||
jsonHeaders.push_back(blockheaderToJSON(pindex));
|
||||
}
|
||||
string strJSON = jsonHeaders.write() + "\n";
|
||||
conn->stream() << HTTPReply(HTTP_OK, strJSON, fRun) << std::flush;
|
||||
return true;
|
||||
}
|
||||
|
||||
default: {
|
||||
throw RESTERR(HTTP_NOT_FOUND, "output format not found (available: .bin, .hex)");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user