20 #include <ripple/app/ledger/LedgerMaster.h>
21 #include <ripple/app/misc/HashRouter.h>
22 #include <ripple/app/misc/NetworkOPs.h>
23 #include <ripple/app/misc/ValidatorList.h>
24 #include <ripple/app/misc/ValidatorSite.h>
25 #include <ripple/basics/base64.h>
26 #include <ripple/basics/make_SSLContext.h>
27 #include <ripple/beast/core/LexicalCast.h>
28 #include <ripple/core/DatabaseCon.h>
29 #include <ripple/nodestore/DatabaseShard.h>
30 #include <ripple/overlay/Cluster.h>
31 #include <ripple/overlay/impl/ConnectAttempt.h>
32 #include <ripple/overlay/impl/PeerImp.h>
33 #include <ripple/overlay/predicates.h>
34 #include <ripple/peerfinder/make_Manager.h>
35 #include <ripple/rpc/handlers/GetCounts.h>
36 #include <ripple/rpc/json_body.h>
37 #include <ripple/server/SimpleWriter.h>
39 #include <boost/algorithm/string/predicate.hpp>
40 #include <boost/utility/in_place_factory.hpp>
66 namespace CrawlOptions {
84 overlay_.remove(*
this);
112 if (ec || overlay_.isStopping())
114 if (ec && ec != boost::asio::error::operation_aborted)
116 JLOG(overlay_.journal_.error()) <<
"on_timer: " << ec.message();
121 overlay_.m_peerFinder->once_per_second();
122 overlay_.sendEndpoints();
123 overlay_.autoConnect();
142 boost::asio::io_service& io_service,
158 app_.journal(
"PeerFinder"),
167 [counts =
m_traffic.getCounts(), collector]() {
171 for (
size_t i = 0; i < counts.size(); ++i)
211 handoff.
moved =
true;
213 JLOG(journal.
debug()) <<
"Peer connection upgrade from " << remote_endpoint;
216 auto const local_endpoint(
217 stream_ptr->next_layer().socket().local_endpoint(ec));
220 JLOG(journal.
debug()) << remote_endpoint <<
" failed: " << ec.message();
226 if (consumer.disconnect())
236 handoff.
moved =
false;
245 return boost::iequals(s,
"peer");
248 handoff.
moved =
false;
257 if (!negotiatedVersion)
260 handoff.
moved =
false;
264 remote_endpoint.address(),
265 "Unable to agree on a protocol version");
274 handoff.
moved =
false;
278 remote_endpoint.address(),
279 "Incorrect security cookie");
291 remote_endpoint.address(),
297 bool const reserved =
305 JLOG(journal.
debug())
306 <<
"Peer " << remote_endpoint <<
" redirected, slots full";
307 handoff.
moved =
false;
309 slot, request, remote_endpoint.address());
315 auto const peer = std::make_shared<PeerImp>(
323 std::move(stream_ptr),
331 auto const result =
m_peers.emplace(peer->slot(), peer);
332 assert(result.second);
335 list_.emplace(peer.get(), peer);
339 handoff.
moved =
true;
344 JLOG(journal.
debug()) <<
"Peer " << remote_endpoint
345 <<
" fails handshake (" << e.
what() <<
")";
348 handoff.
moved =
false;
350 slot, request, remote_endpoint.address(), e.
what());
364 return !versions.empty();
381 boost::beast::http::response<json_body> msg;
382 msg.version(request.version());
383 msg.result(boost::beast::http::status::service_unavailable);
385 msg.insert(
"Remote-Address", remote_address);
386 msg.insert(
"Content-Type",
"application/json");
387 msg.insert(boost::beast::http::field::connection,
"close");
393 ips.
append(_.address.to_string());
395 msg.prepare_payload();
396 return std::make_shared<SimpleWriter>(msg);
406 boost::beast::http::response<boost::beast::http::empty_body> msg;
407 msg.version(request.version());
408 msg.result(boost::beast::http::status::bad_request);
409 msg.reason(
"Bad Request (" + text +
")");
411 msg.insert(
"Remote-Address", remote_address.to_string());
412 msg.insert(boost::beast::http::field::connection,
"close");
413 msg.prepare_payload();
414 return std::make_shared<SimpleWriter>(msg);
425 if (usage.disconnect())
427 JLOG(
journal_.
info()) <<
"Over resource limit: " << remote_endpoint;
434 JLOG(
journal_.
debug()) <<
"Connect: No slot for " << remote_endpoint;
438 auto const p = std::make_shared<ConnectAttempt>(
450 list_.emplace(p.get(), p);
463 auto const result =
m_peers.emplace(peer->slot(), peer);
464 assert(result.second);
469 auto const result =
ids_.emplace(
470 std::piecewise_construct,
473 assert(result.second);
479 JLOG(
journal_.
debug()) <<
"activated " << peer->getRemoteAddress() <<
" ("
495 auto const iter =
m_peers.find(slot);
558 if (bootstrapIps.empty())
561 bootstrapIps.
push_back(
"r.ripple.com 51235");
564 bootstrapIps.
push_back(
"zaphod.alloy.ee 51235");
567 bootstrapIps.push_back(
"sahyadri.isrdc.in 51235");
577 for (
auto const& addr : addresses)
579 if (addr.port() == 0)
581 Throw<std::runtime_error>(
582 "Port not specified for "
603 if (!addresses.
empty())
612 auto const timer = std::make_shared<Timer>(*
this);
614 list_.emplace(timer.get(), timer);
643 for (
auto const& i : stats)
648 item[
"category"] = i.name;
669 auto const result(
ids_.emplace(
670 std::piecewise_construct,
673 assert(result.second);
677 JLOG(
journal_.
debug()) <<
"activated " << peer->getRemoteAddress() <<
" ("
700 auto const n = m->list_size();
701 auto const& journal = from->pjournal();
703 JLOG(journal.debug()) <<
"TMManifest, " << n
704 << (n == 1 ?
" item" :
" items");
708 auto& s = m->list().Get(i).stobject();
712 uint256 const hash = mo->hash();
713 if (!hashRouter.addSuppressionPeer(hash, from->id()))
715 JLOG(journal.info()) <<
"Duplicate manifest #" << i + 1;
721 JLOG(journal.info()) <<
"Untrusted manifest #" << i + 1;
726 auto const serialized = mo->serialized;
740 soci::transaction tr(*db);
741 static const char*
const sql =
742 "INSERT INTO ValidatorManifests (RawData) VALUES "
744 soci::blob rawData(*db);
746 *db << sql, soci::use(rawData);
749 protocol::TMManifests o;
750 o.add_list()->set_stobject(s);
752 auto const toSkip = hashRouter.shouldRelay(hash);
755 std::make_shared<Message>(o, protocol::mtMANIFESTS),
762 <<
"Bad manifest #" << i + 1 <<
": " <<
to_string(result);
767 JLOG(journal.warn()) <<
"Malformed manifest #" << i + 1;
786 using namespace std::chrono_literals;
789 auto const numPeers{
size()};
800 auto const timeout(
seconds((hops * hops) * 10));
808 for (
auto&
id :
ids_)
813 protocol::TMGetPeerShardInfo tmGPS;
814 tmGPS.set_hops(hops);
816 tmGPS, protocol::mtGET_PEER_SHARD_INFO)))
824 csLast_ = duration_cast<seconds>(
835 if (
auto psi = peer->getPeerShardInfo())
837 for (auto const& e : *psi)
839 auto it{peerShardInfo.find(e.first)};
840 if (it != peerShardInfo.end())
842 it->second.shardIndexes += e.second.shardIndexes;
844 peerShardInfo.emplace(std::move(e));
851 for (
auto const& e : peerShardInfo)
857 auto const& address{e.second.endpoint.address()};
858 if (!address.is_unspecified())
859 pv[jss::ip] = address.to_string();
861 pv[jss::complete_shards] =
to_string(e.second.shardIndexes);
890 auto const s = e->getScore(score(e));
895 return lhs.first > rhs.first;
899 for (
auto const& e : v)
934 sp->getNodePublic().data(), sp->getNodePublic().size());
935 pv[jss::type] = sp->slot()->inbound() ?
"in" :
"out";
937 duration_cast<seconds>(sp->uptime()).count());
940 pv[jss::ip] = sp->getRemoteAddress().address().to_string();
941 if (sp->slot()->inbound())
943 if (
auto port = sp->slot()->listening_port())
944 pv[jss::port] = *port;
953 auto version{sp->getVersion()};
954 if (!version.empty())
955 pv[jss::version] = std::move(version);
959 sp->ledgerRange(minSeq, maxSeq);
960 if (minSeq != 0 || maxSeq != 0)
961 pv[jss::complete_ledgers] =
964 if (
auto shardIndexes = sp->getShardIndexes())
965 pv[jss::complete_shards] =
to_string(*shardIndexes);
974 bool const humanReadable =
false;
975 bool const admin =
false;
976 bool const counters =
false;
983 server_info.
removeMember(jss::load_factor_fee_escalation);
987 if (server_info.
isMember(jss::validated_ledger))
989 Json::Value& validated_ledger = server_info[jss::validated_ledger];
1010 if (validators.
isMember(jss::publisher_lists))
1012 Json::Value& publisher_lists = validators[jss::publisher_lists];
1014 for (
auto& publisher : publisher_lists)
1026 if (validatorSites.
isMember(jss::validator_sites))
1028 validators[jss::validator_sites] =
1029 std::move(validatorSites[jss::validator_sites]);
1045 if (req.target() !=
"/crawl" ||
1049 boost::beast::http::response<json_body> msg;
1050 msg.version(req.version());
1051 msg.result(boost::beast::http::status::ok);
1053 msg.insert(
"Content-Type",
"application/json");
1054 msg.insert(
"Connection",
"close");
1074 msg.prepare_payload();
1075 handoff.
response = std::make_shared<SimpleWriter>(msg);
1089 auto key = req.target();
1090 if (key.starts_with(
"/vl/"))
1091 key.remove_prefix(strlen(
"/vl/"));
1093 key.remove_prefix(strlen(
"/unl/"));
1100 boost::beast::http::response<json_body> msg;
1101 msg.version(req.version());
1103 msg.insert(
"Content-Type",
"application/json");
1104 msg.insert(
"Connection",
"close");
1109 msg.result(boost::beast::http::status::not_found);
1110 msg.insert(
"Content-Length",
"0");
1116 msg.result(boost::beast::http::status::ok);
1121 msg.prepare_payload();
1122 handoff.
response = std::make_shared<SimpleWriter>(msg);
1163 auto const iter =
ids_.find(
id);
1164 if (iter !=
ids_.end())
1165 return iter->second.lock();
1175 for (
auto const& e :
ids_)
1177 if (
auto peer = e.second.lock())
1179 if (peer->getNodePublic() == pubKey)
1191 auto const sm = std::make_shared<Message>(m, protocol::mtPROPOSE_LEDGER);
1199 auto const sm = std::make_shared<Message>(m, protocol::mtVALIDATION);
1202 SerialIter sit(m.validation().data(), m.validation().size());
1203 auto val = std::make_shared<STValidation>(
1215 if (m.has_hops() && m.hops() >=
maxTTL)
1220 std::make_shared<Message>(m, protocol::mtPROPOSE_LEDGER);
1222 if (toSkip->find(p->id()) == toSkip->end())
1231 if (m.has_hops() && m.hops() >=
maxTTL)
1235 auto const sm = std::make_shared<Message>(m, protocol::mtVALIDATION);
1237 if (toSkip->find(p->id()) == toSkip->end())
1249 list_.erase(&child);
1270 work_ = boost::none;
1273 for (
auto const& element :
list_)
1279 for (
auto const& child : children)
1281 if (child !=
nullptr)
1290 for (
auto addr : result)
1297 auto const result =
m_peerFinder->buildEndpointsForPeers();
1298 for (
auto const& e : result)
1303 auto const iter =
m_peers.find(e.first);
1305 peer = iter->second.lock();
1308 peer->sendEndpoints(e.second.begin(), e.second.end());
1317 auto const& p = std::dynamic_pointer_cast<PeerImp>(bp);
1318 return p->hasLedger(hash_, seq_);
1324 auto const& p = std::dynamic_pointer_cast<PeerImp>(bp);
1325 return p->hasTxSet(hash_);
1336 auto const& section = config.
section(
"overlay");
1338 setup.
expire = get<bool>(section,
"expire",
false);
1342 Throw<std::runtime_error>(
"Configured IP limit is invalid");
1345 set(ip,
"public_ip", section);
1348 boost::system::error_code ec;
1351 Throw<std::runtime_error>(
"Configured public IP is invalid");
1356 auto const& section = config.
section(
"crawl");
1357 auto const& values = section.
values();
1359 if (values.size() > 1)
1361 Throw<std::runtime_error>(
1362 "Configured [crawl] section is invalid, too many values");
1365 bool crawlEnabled =
true;
1368 if (values.size() == 1)
1372 crawlEnabled = boost::lexical_cast<bool>(values.front());
1374 catch (boost::bad_lexical_cast
const&)
1376 Throw<std::runtime_error>(
1377 "Configured [crawl] section has invalid value: " +
1384 if (get<bool>(section,
"overlay",
true))
1388 if (get<bool>(section,
"server",
true))
1392 if (get<bool>(section,
"counts",
false))
1396 if (get<bool>(section,
"unl",
true))
1403 auto const& section = config.
section(
"vl");
1410 auto id = config.
legacy(
"network_id");
1417 if (
id ==
"testnet")
1428 Throw<std::runtime_error>(
1429 "Configured [network_id] section is invalid: must be a number "
1430 "or one of the strings 'main', 'testnet' or 'devnet'.");
1444 boost::asio::io_service& io_service,
1448 return std::make_unique<OverlayImpl>(
std::string const & name() const
Returns the name of this source.
virtual Consumer newInboundEndpoint(beast::IP::Endpoint const &address)=0
Create a new endpoint keyed by inbound IP address or the forwarded IP if proxied.
std::shared_ptr< Peer > findPeerByShortID(Peer::id_t const &id) override
Returns the peer with the matching short id, or null.
void relay(protocol::TMProposeSet &m, uint256 const &uid) override
Relay a proposal.
virtual Consumer newOutboundEndpoint(beast::IP::Endpoint const &address)=0
Create a new endpoint keyed by outbound IP address and port.
Json::Value getServerCounts()
Returns information about the local server's performance counters.
std::size_t selectPeers(PeerSet &set, std::size_t limit, std::function< bool(std::shared_ptr< Peer > const &)> score) override
Select from active peers.
const beast::Journal journal_
boost::asio::ip::address address_type
virtual Cluster & cluster()=0
virtual Json::Value getServerInfo(bool human, bool admin, bool counters)=0
auto const & getCounts() const
An up-to-date copy of all the counters.
PublicKey getMasterKey(PublicKey const &pk) const
Returns ephemeral signing key's master public key.
boost::optional< boost::asio::io_service::work > work_
void operator()(std::shared_ptr< Peer > const &peer)
NodeID calcNodeID(PublicKey const &pk)
Calculate the 160-bit node ID from a node public key.
void stopped()
Called by derived classes to indicate that the stoppable has stopped.
virtual void pubManifest(Manifest const &)=0
static bool is_upgrade(boost::beast::http::header< true, Fields > const &req)
hash_map< Peer::id_t, std::weak_ptr< PeerImp > > ids_
@ arrayValue
array value (ordered list)
constexpr std::uint32_t maxTTL
boost::beast::http::request< boost::beast::http::dynamic_body > http_request_type
boost::optional< Json::Value > getAvailable(boost::beast::string_view const &pubKey)
Returns the current valid list for the given publisher key, if available, as a Json object.
virtual ValidatorSite & validatorSites()=0
std::uint32_t crawlOptions
void convert(soci::blob &from, std::vector< std::uint8_t > &to)
std::set< std::uint32_t > csIDs_
std::recursive_mutex mutex_
void on_timer(error_code ec)
virtual PeerReservationTable & peerReservations()=0
std::atomic< Peer::id_t > next_id_
std::string base64_encode(std::uint8_t const *data, std::size_t len)
bool empty() const noexcept
std::shared_ptr< boost::asio::ssl::context > make_SSLContext(std::string const &cipherList)
Create a self-signed SSL context that allows anonymous Diffie Hellman.
std::unique_ptr< Overlay > make_Overlay(Application &app, Overlay::Setup const &setup, Stoppable &parent, ServerHandler &serverHandler, Resource::Manager &resourceManager, Resolver &resolver, boost::asio::io_service &io_service, BasicConfig const &config, beast::insight::Collector::ptr const &collector)
Creates the implementation of Overlay.
static std::string makePrefix(std::uint32_t id)
std::string features
The set of features we advertise.
Handoff onHandoff(std::unique_ptr< stream_type > &&bundle, http_request_type &&request, endpoint_type remote_endpoint) override
Conditionally accept an incoming HTTP request.
std::string toBase58(AccountID const &v)
Convert AccountID to base58 checked string.
std::condition_variable csCV_
void setup(Setup const &setup, beast::Journal journal)
boost::asio::io_service::strand strand_
Json::Value getServerInfo()
Returns information about the local server.
void onStart() override
Override called during start.
std::vector< ProtocolVersion > parseProtocolVersions(boost::beast::string_view const &value)
Parse a set of protocol versions.
Stopwatch & stopwatch()
Returns an instance of a wall clock.
std::string to_string(ListDisposition disposition)
virtual std::shared_ptr< Slot > new_outbound_slot(beast::IP::Endpoint const &remote_endpoint)=0
Create a new outbound slot with the specified remote endpoint.
void connect(beast::IP::Endpoint const &remote_endpoint) override
Establish a peer connection to the specified endpoint.
Json::Value json() override
Return diagnostics on the status of all peers.
Setup const & setup() const
bool peerPrivate
true if we want our IP address kept private.
bool processValidatorList(http_request_type const &req, Handoff &handoff)
Handles validator list requests.
Select all peers that are in the specified set.
virtual NetworkOPs & getOPs()=0
virtual DatabaseCon & getWalletDB()=0
Retrieve the "wallet database".
std::vector< std::string > const & values() const
Returns all the values in the section.
bool is_private(AddressV4 const &addr)
Returns true if the address is a private unroutable address.
Sends a message to all peers.
void onChildrenStopped() override
Override called when all children have stopped.
std::condition_variable_any cond_
boost::optional< ProtocolVersion > negotiateProtocolVersion(std::vector< ProtocolVersion > const &versions)
Given a list of supported protocol versions, choose the one we prefer.
void for_each(UnaryFunc &&f)
PublicKey verifyHandshake(boost::beast::http::fields const &headers, ripple::uint256 const &sharedValue, boost::optional< std::uint32_t > networkID, beast::IP::Address public_ip, beast::IP::Address remote, Application &app)
Validate header fields necessary for upgrading the link to the peer protocol.
static IP::Endpoint from_asio(boost::asio::ip::address const &address)
boost::optional< std::string > member(PublicKey const &node) const
Determines whether a node belongs in the cluster.
PeerFinder::Manager & peerFinder()
void send(protocol::TMProposeSet &m) override
Broadcast a proposal.
bool is_keep_alive(boost::beast::http::message< isRequest, Body, Fields > const &m)
Overlay::Setup setup_Overlay(BasicConfig const &config)
Value & append(const Value &value)
Append value to array at the end.
void onManifests(std::shared_ptr< protocol::TMManifests > const &m, std::shared_ptr< PeerImp > const &from)
Provides an interface for starting and stopping.
beast::IP::Address public_ip
bool wantIncoming
true if we want to accept incoming connections.
LockedSociSession checkoutDb()
Resource::Manager & resourceManager()
PeerSequence getActivePeers() override
Returns a sequence representing the current list of peers.
@ objectValue
object value (collection of name/value pairs).
void add(Source &source)
Add a child source.
Json::Value getOverlayInfo()
Returns information about peers on the overlay network.
boost::asio::io_service & io_service_
virtual Config & config()=0
Json::Value getJson() const
Return JSON representation of configured validator sites.
std::vector< std::string > IPS_FIXED
bool areChildrenStopped() const
Returns true if all children have stopped.
ServerHandler & serverHandler()
bool set(T &target, std::string const &name, Section const §ion)
Set a value from a configuration Section If the named value is not found or doesn't parse as a T,...
Json::Value getUnlInfo()
Returns information about the local server's UNL.
bool listed(PublicKey const &identity) const
Returns true if public key is included on any lists.
boost::optional< uint256 > makeSharedValue(stream_type &ssl, beast::Journal journal)
Computes a shared value based on the SSL connection state.
double outPeers
The number of automatic outbound connections to maintain.
int maxPeers
The largest number of public peer slots to allow.
void legacy(std::string const §ion, std::string value)
Set a value that is not a key/value pair.
std::unique_ptr< PeerFinder::Manager > m_peerFinder
bool isMember(const char *key) const
Return true if the object has a member named key.
A generic endpoint for log messages.
ServerHandler & serverHandler_
void onPrepare() override
Override called during preparation.
Child(OverlayImpl &overlay)
boost::optional< std::set< PeerShortID > > shouldRelay(uint256 const &key)
Determines whether the hashed item should be relayed.
Result split_commas(FwdIt first, FwdIt last)
std::size_t size() override
The number of active peers on the network Active peers are only those peers that have completed the h...
virtual PublicKey const & getValidationPublicKey() const =0
OverlayImpl(Application &app, Setup const &setup, Stoppable &parent, ServerHandler &serverHandler, Resource::Manager &resourceManager, Resolver &resolver, boost::asio::io_service &io_service, BasicConfig const &config, beast::insight::Collector::ptr const &collector)
virtual ValidatorList & validators()=0
bool processRequest(http_request_type const &req, Handoff &handoff)
Handles non-peer protocol requests.
@ accepted
Manifest is valid.
Tracks load and resource consumption.
std::string const & getFullVersionString()
Full server version string.
void applyTuning()
Adjusts the values so they follow the business rules.
Json::Value getCountsJson(Application &app, int minObjectCount)
Resource::Manager & m_resourceManager
T emplace_back(T... args)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
boost::optional< Manifest > deserializeManifest(Slice s)
Constructs Manifest from serialized string.
void checkSanity(std::uint32_t) override
Calls the checkSanity function on each peer.
virtual beast::Journal journal(std::string const &name)=0
virtual ManifestCache & validatorManifests()=0
Value removeMember(const char *key)
Remove and return the named member.
std::uint16_t listeningPort
The listening port number.
send_if_not_pred< Predicate > send_if_not(std::shared_ptr< Message > const &m, Predicate const &f)
Helper function to aid in type deduction.
void remove(std::shared_ptr< PeerFinder::Slot > const &slot)
Manages the set of connected peers.
void activate(std::shared_ptr< PeerImp > const &peer)
Called when a peer has connected successfully This is called after the peer handshake has been comple...
double calcOutPeers() const
Returns a suitable value for outPeers according to the rules.
Supports data retrieval by managing a set of peers.
void onPeerDeactivate(Peer::id_t id)
boost::optional< std::uint32_t > networkID
boost::container::flat_map< Child *, std::weak_ptr< Child > > list_
void lastLink(std::uint32_t id)
Called when the last link from a peer chain is received.
void check() override
Calls the check function on each peer.
Timer(OverlayImpl &overlay)
bool operator()(std::shared_ptr< Peer > const &) const
Wraps a Journal::Sink to prefix its output with a string.
Used to indicate the result of a server connection handoff.
std::shared_ptr< Peer > findPeerByPublicKey(PublicKey const &pubKey) override
Returns the peer with the matching public key, or null.
Json::Value getJson() const
Return a JSON representation of the state of the validator list.
bool contains(PublicKey const &nodeId)
A functor to visit all active peers and retrieve their JSON data.
bool operator()(std::shared_ptr< Peer > const &) const
std::vector< std::string > IPS
std::shared_ptr< Writer > makeRedirectResponse(std::shared_ptr< PeerFinder::Slot > const &slot, http_request_type const &request, address_type remote_address)
A version-independent IP address and port combination.
std::weak_ptr< Timer > timer_
std::shared_ptr< boost::asio::ssl::context > context
std::shared_ptr< Writer > response
static boost::asio::ip::tcp::endpoint to_asio_endpoint(IP::Endpoint const &address)
bool autoConnect
true if we want to establish connections automatically
PeerFinder configuration settings.
std::atomic< std::chrono::seconds > csLast_
void reportTraffic(TrafficCount::category cat, bool isInbound, int bytes)
Json::Value crawlShards(bool pubKey, std::uint32_t hops) override
Returns information reported to the crawl shard RPC command.
void addCount(category cat, bool inbound, int bytes)
Account for traffic associated with the given category.
ManifestDisposition applyManifest(Manifest m)
Add manifest to cache.
std::shared_ptr< Writer > makeErrorResponse(std::shared_ptr< PeerFinder::Slot > const &slot, http_request_type const &request, address_type remote_address, std::string msg)
@ checkSeconds
How often we check connections (seconds)
hash_map< std::shared_ptr< PeerFinder::Slot >, std::weak_ptr< PeerImp > > m_peers
void resolve(std::vector< std::string > const &names, Handler handler)
resolve all hostnames on the list
static bool isPeerUpgrade(http_request_type const &request)
void add_active(std::shared_ptr< PeerImp > const &peer)
boost::system::error_code error_code
int ipLimit
Limit how many incoming connections we allow per IP.
void onWrite(beast::PropertyStream::Map &stream) override
Subclass override.
virtual HashRouter & getHashRouter()=0
Holds unparsed configuration information.
void onStop() override
Override called when the stop notification is issued.
Section & section(std::string const &name)
Returns the section with the given name.
virtual void pubValidation(STValidation::ref val)=0
int limit() override
Returns the maximum number of peers we are configured to allow.
bool processCrawl(http_request_type const &req, Handoff &handoff)
Handles crawl requests.
boost::asio::ip::tcp::endpoint endpoint_type
bool isStopping() const
Returns true if the stoppable should stop.