rippled
ValidatorSite.h
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2016 Ripple Labs Inc.
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
20 #ifndef RIPPLE_APP_MISC_VALIDATORSITE_H_INCLUDED
21 #define RIPPLE_APP_MISC_VALIDATORSITE_H_INCLUDED
22 
23 #include <ripple/app/main/Application.h>
24 #include <ripple/app/misc/ValidatorList.h>
25 #include <ripple/app/misc/detail/Work.h>
26 #include <ripple/basics/Log.h>
27 #include <ripple/basics/StringUtilities.h>
28 #include <ripple/core/Config.h>
29 #include <ripple/json/json_value.h>
30 
31 #include <boost/asio.hpp>
32 
33 #include <memory>
34 #include <mutex>
35 #include <optional>
36 
37 namespace ripple {
38 
70 {
71  friend class Work;
72 
73 private:
74  using error_code = boost::system::error_code;
76  using endpoint_type = boost::asio::ip::tcp::endpoint;
77 
78  struct Site
79  {
80  struct Status
81  {
82  clock_type::time_point refreshed;
85  };
86 
87  struct Resource
88  {
89  explicit Resource(std::string uri_);
92  };
93 
94  explicit Site(std::string uri);
95 
98 
103 
108 
109  unsigned short redirCount;
111  clock_type::time_point nextRefresh;
115  };
116 
119 
122 
125  boost::asio::basic_waitable_timer<clock_type> timer_;
126 
127  // A list is currently being fetched from a site
129 
130  // One or more lists are due to be fetched
133 
134  // The configured list of URIs for fetching lists
136 
137  // time to allow for requests to complete
139 
140 public:
142  Application& app,
143  std::optional<beast::Journal> j = std::nullopt,
145  ~ValidatorSite();
146 
157  bool
158  load(std::vector<std::string> const& siteURIs);
159 
168  void
169  start();
170 
177  void
178  join();
179 
188  void
189  stop();
190 
194  getJson() const;
195 
196 private:
199  void
201 
203  void
204  onRequestTimeout(std::size_t siteIdx, error_code const& ec);
205 
207  void
208  onTimer(std::size_t siteIdx, error_code const& ec);
209 
211  void
212  onSiteFetch(
213  boost::system::error_code const& ec,
214  endpoint_type const& endpoint,
215  detail::response_type&& res,
216  std::size_t siteIdx);
217 
219  void
220  onTextFetch(
221  boost::system::error_code const& ec,
222  std::string const& res,
223  std::size_t siteIdx);
224 
227  void
228  makeRequest(
230  std::size_t siteIdx,
232 
235  void
237  std::string const& res,
238  std::size_t siteIdx,
240 
246  std::size_t siteIdx,
248 
251  bool
252  missingSite();
253 };
254 
255 } // namespace ripple
256 
257 #endif
std::chrono::system_clock
ripple::Application
Definition: Application.h:101
ripple::ValidatorSite::Site
Definition: ValidatorSite.h:78
ripple::ValidatorSite::Site::refreshInterval
std::chrono::minutes refreshInterval
Definition: ValidatorSite.h:110
std::string
STL class.
std::shared_ptr
STL class.
ripple::ListDisposition
ListDisposition
Definition: ValidatorList.h:55
ripple::ValidatorSite::timer_
boost::asio::basic_waitable_timer< clock_type > timer_
Definition: ValidatorSite.h:125
ripple::parsedURL
Definition: StringUtilities.h:100
ripple::ValidatorSite::Site::lastRefreshStatus
std::optional< Status > lastRefreshStatus
Definition: ValidatorSite.h:112
ripple::ValidatorSite
Definition: ValidatorSite.h:69
ripple::ValidatorSite::endpoint_type
boost::asio::ip::tcp::endpoint endpoint_type
Definition: ValidatorSite.h:76
std::vector
STL class.
ripple::ValidatorSite::stop
void stop()
Stop fetching lists from sites.
Definition: ValidatorSite.cpp:176
std::chrono::minutes
ripple::ValidatorSite::onRequestTimeout
void onRequestTimeout(std::size_t siteIdx, error_code const &ec)
request took too long
Definition: ValidatorSite.cpp:305
ripple::ValidatorSite::Site::Resource::uri
const std::string uri
Definition: ValidatorSite.h:90
ripple::ValidatorSite::work_
std::weak_ptr< detail::Work > work_
Definition: ValidatorSite.h:124
std::lock_guard
STL class.
ripple::ValidatorSite::Site::lastRequestSuccessful
bool lastRequestSuccessful
Definition: ValidatorSite.h:114
ripple::ValidatorSite::processRedirect
std::shared_ptr< Site::Resource > processRedirect(detail::response_type &res, std::size_t siteIdx, std::lock_guard< std::mutex > &lock)
Interpret a redirect response.
Definition: ValidatorSite.cpp:475
ripple::ValidatorSite::onSiteFetch
void onSiteFetch(boost::system::error_code const &ec, endpoint_type const &endpoint, detail::response_type &&res, std::size_t siteIdx)
Store latest list fetched from site.
Definition: ValidatorSite.cpp:521
ripple::ValidatorSite::state_mutex_
std::mutex state_mutex_
Definition: ValidatorSite.h:121
ripple::ValidatorSite::Work
friend class Work
Definition: ValidatorSite.h:71
ripple::ValidatorSite::fetching_
std::atomic< bool > fetching_
Definition: ValidatorSite.h:128
ripple::ValidatorSite::~ValidatorSite
~ValidatorSite()
Definition: ValidatorSite.cpp:104
ripple::detail::response_type
boost::beast::http::response< boost::beast::http::string_body > response_type
Definition: Work.h:31
ripple::ValidatorSite::app_
Application & app_
Definition: ValidatorSite.h:117
ripple::ValidatorSite::parseJsonResponse
void parseJsonResponse(std::string const &res, std::size_t siteIdx, std::lock_guard< std::mutex > &lock)
Parse json response from validator list site.
Definition: ValidatorSite.cpp:353
ripple::ValidatorSite::Site::Status::refreshed
clock_type::time_point refreshed
Definition: ValidatorSite.h:82
ripple::ValidatorSite::pending_
std::atomic< bool > pending_
Definition: ValidatorSite.h:131
ripple::ValidatorSite::getJson
Json::Value getJson() const
Return JSON representation of configured validator sites.
Definition: ValidatorSite.cpp:644
ripple::ValidatorSite::j_
const beast::Journal j_
Definition: ValidatorSite.h:118
ripple::ValidatorSite::cv_
std::condition_variable cv_
Definition: ValidatorSite.h:123
ripple::ValidatorSite::Site::Status::message
std::string message
Definition: ValidatorSite.h:84
beast::Journal
A generic endpoint for log messages.
Definition: Journal.h:58
ripple::ValidatorSite::join
void join()
Wait for current fetches from sites to complete.
Definition: ValidatorSite.cpp:169
std::atomic< bool >
ripple::ValidatorSite::sites_mutex_
std::mutex sites_mutex_
Definition: ValidatorSite.h:120
ripple::ValidatorSite::Site::redirCount
unsigned short redirCount
Definition: ValidatorSite.h:109
memory
ripple::ValidatorSite::sites_
std::vector< Site > sites_
Definition: ValidatorSite.h:135
std::weak_ptr
STL class.
ripple::ValidatorSite::makeRequest
void makeRequest(std::shared_ptr< Site::Resource > resource, std::size_t siteIdx, std::lock_guard< std::mutex > &lock)
Initiate request to given resource.
Definition: ValidatorSite.cpp:224
ripple::ValidatorSite::Site::nextRefresh
clock_type::time_point nextRefresh
Definition: ValidatorSite.h:111
ripple::ValidatorSite::requestTimeout_
const std::chrono::seconds requestTimeout_
Definition: ValidatorSite.h:138
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::ValidatorSite::Site::Resource
Definition: ValidatorSite.h:87
ripple::ValidatorSite::Site::activeResource
std::shared_ptr< Resource > activeResource
the active resource being requested.
Definition: ValidatorSite.h:107
ripple::ValidatorSite::Site::Resource::Resource
Resource(std::string uri_)
Definition: ValidatorSite.cpp:40
ripple::ValidatorSite::onTextFetch
void onTextFetch(boost::system::error_code const &ec, std::string const &res, std::size_t siteIdx)
Store latest list fetched from anywhere.
Definition: ValidatorSite.cpp:607
ripple::ValidatorSite::Site::Status::disposition
ListDisposition disposition
Definition: ValidatorSite.h:83
ripple::ValidatorSite::Site::loadedResource
std::shared_ptr< Resource > loadedResource
the original uri as loaded from config
Definition: ValidatorSite.h:97
ripple::ValidatorSite::stopping_
std::atomic< bool > stopping_
Definition: ValidatorSite.h:132
ripple::ValidatorSite::ValidatorSite
ValidatorSite(Application &app, std::optional< beast::Journal > j=std::nullopt, std::chrono::seconds timeout=std::chrono::seconds{20})
Definition: ValidatorSite.cpp:90
std::condition_variable
ripple::ValidatorSite::Site::Site
Site(std::string uri)
Definition: ValidatorSite.cpp:79
ripple::ValidatorSite::missingSite
bool missingSite()
If no sites are provided, or a site fails to load, get a list of local cache files from the Validator...
Definition: ValidatorSite.cpp:122
ripple::ValidatorSite::Site::Resource::pUrl
parsedURL pUrl
Definition: ValidatorSite.h:91
ripple::ValidatorSite::Site::Status
Definition: ValidatorSite.h:80
optional
mutex
std::size_t
ripple::ValidatorSite::start
void start()
Start fetching lists from sites.
Definition: ValidatorSite.cpp:161
ripple::ValidatorSite::onTimer
void onTimer(std::size_t siteIdx, error_code const &ec)
Fetch site whose time has come.
Definition: ValidatorSite.cpp:322
ripple::ValidatorSite::Site::startingResource
std::shared_ptr< Resource > startingResource
the resource to request at <timer> intervals.
Definition: ValidatorSite.h:102
ripple::ValidatorSite::error_code
boost::system::error_code error_code
Definition: ValidatorSite.h:74
ripple::ValidatorSite::setTimer
void setTimer(std::lock_guard< std::mutex > &)
Queue next site to be fetched lock over state_mutex_ required.
Definition: ValidatorSite.cpp:202
ripple::ValidatorSite::load
bool load(std::vector< std::string > const &siteURIs)
Load configured site URIs.
Definition: ValidatorSite.cpp:129
ripple::ValidatorSite::Site::lastRequestEndpoint
endpoint_type lastRequestEndpoint
Definition: ValidatorSite.h:113
Json::Value
Represents a JSON value.
Definition: json_value.h:145