Skip to content

Commit

Permalink
Add RPC/WebSocket ports to server_info (XRPLF#4427)
Browse files Browse the repository at this point in the history
  • Loading branch information
drlongle committed Feb 20, 2023
1 parent aebf2ac commit 41c3269
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 3 deletions.
7 changes: 7 additions & 0 deletions src/ripple/app/main/Application.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -602,6 +602,13 @@ class ApplicationImp : public Application, public BasicApp
return *m_networkOPs;
}

virtual ServerHandlerImp&
getServerHandler() override
{
assert(serverHandler_);
return *serverHandler_;
}

boost::asio::io_service&
getIOService() override
{
Expand Down
3 changes: 3 additions & 0 deletions src/ripple/app/main/Application.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ class Overlay;
class PathRequests;
class PendingSaves;
class PublicKey;
class ServerHandlerImp;
class SecretKey;
class STLedgerEntry;
class TimeKeeper;
Expand Down Expand Up @@ -231,6 +232,8 @@ class Application : public beast::PropertyStream::Source
getOPs() = 0;
virtual OrderBookDB&
getOrderBookDB() = 0;
virtual ServerHandlerImp&
getServerHandler() = 0;
virtual TransactionMaster&
getMasterTransaction() = 0;
virtual perf::PerfLog&
Expand Down
35 changes: 35 additions & 0 deletions src/ripple/app/misc/NetworkOPs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@
#include <ripple/rpc/BookChanges.h>
#include <ripple/rpc/DeliveredAmount.h>
#include <ripple/rpc/impl/RPCHelpers.h>
#include <ripple/rpc/impl/ServerHandlerImp.h>
#include <boost/asio/ip/host_name.hpp>
#include <boost/asio/steady_timer.hpp>

Expand Down Expand Up @@ -2661,6 +2662,40 @@ NetworkOPsImp::getServerInfo(bool human, bool admin, bool counters)
info["reporting"] = app_.getReportingETL().getInfo();
}

// This array must be sorted in an increasing order.
static constexpr std::array<std::string_view, 6> protocols{
"http", "https", "ws", "ws2", "wss", "wss2"};
{
Json::Value ports{Json::arrayValue};
std::vector<std::string> proto;
for (auto const& port : app_.getServerHandler().setup().ports)
{
// Don't publish admin ports for non-admin users
if (!admin &&
!(port.admin_nets_v4.empty() && port.admin_nets_v6.empty() &&
port.admin_user.empty() && port.admin_password.empty()))
continue;
proto.clear();
std::set_intersection(
std::begin(port.protocol),
std::end(port.protocol),
std::begin(protocols),
std::end(protocols),
std::back_inserter(proto));
if (!proto.empty())
{
auto& jv = ports.append(Json::Value(Json::objectValue));
jv[jss::port] = std::to_string(port.port);
jv[jss::protocol] = Json::Value{Json::arrayValue};
for (auto const& p : proto)
jv[jss::protocol].append(p);
}
}

if (ports.size())
info[jss::ports] = std::move(ports);
}

return info;
}

Expand Down
5 changes: 3 additions & 2 deletions src/ripple/protocol/jss.h
Original file line number Diff line number Diff line change
Expand Up @@ -459,13 +459,14 @@ JSS(peers); // out: InboundLedger, handlers/Peers, Overlay
JSS(peer_disconnects); // Severed peer connection counter.
JSS(peer_disconnects_resources); // Severed peer connections because of
// excess resource consumption.
JSS(port); // in: Connect
JSS(port); // in: Connect, out: NetworkOPs
JSS(ports); // out: NetworkOPs
JSS(previous); // out: Reservations
JSS(previous_ledger); // out: LedgerPropose
JSS(proof); // in: BookOffers
JSS(propose_seq); // out: LedgerPropose
JSS(proposers); // out: NetworkOPs, LedgerConsensus
JSS(protocol); // out: PeerImp
JSS(protocol); // out: NetworkOPs, PeerImp
JSS(proxied); // out: RPC ping
JSS(pubkey_node); // out: NetworkOPs
JSS(pubkey_publisher); // out: ValidatorList
Expand Down
32 changes: 31 additions & 1 deletion src/test/rpc/ServerInfo_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,15 +77,45 @@ class ServerInfo_test : public beast::unit_test::suite
BEAST_EXPECT(result[jss::result][jss::status] == "success");
BEAST_EXPECT(result[jss::result].isMember(jss::info));
}

{
Env env(*this, makeValidatorConfig());
auto config = makeValidatorConfig();
auto const rpc_port =
(*config)["port_rpc"].get<unsigned int>("port");
auto const ws_port = (*config)["port_ws"].get<unsigned int>("port");
BEAST_EXPECT(rpc_port);
BEAST_EXPECT(ws_port);

Env env(*this, std::move(config));
auto const result = env.rpc("server_info");
BEAST_EXPECT(!result[jss::result].isMember(jss::error));
BEAST_EXPECT(result[jss::result][jss::status] == "success");
BEAST_EXPECT(result[jss::result].isMember(jss::info));
BEAST_EXPECT(
result[jss::result][jss::info][jss::pubkey_validator] ==
validator_data::public_key);

auto const& ports = result[jss::result][jss::info][jss::ports];
BEAST_EXPECT(ports.isArray());
BEAST_EXPECT(ports.size() == 2);
for (auto const& port : ports)
{
auto const& proto = port[jss::protocol];
BEAST_EXPECT(proto.isArray());
auto const p = port[jss::port].asUInt();
BEAST_EXPECT(p == rpc_port || p == ws_port);
if (p == rpc_port)
{
BEAST_EXPECT(proto.size() == 2);
BEAST_EXPECT(proto[0u].asString() == "http");
BEAST_EXPECT(proto[1u].asString() == "ws2");
}
if (p == ws_port)
{
BEAST_EXPECT(proto.size() == 1);
BEAST_EXPECT(proto[0u].asString() == "ws");
}
}
}
}

Expand Down

0 comments on commit 41c3269

Please sign in to comment.