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 #include <boost/asio.hpp>
31 #include <boost/optional.hpp>
32 #include <memory>
33 #include <mutex>
34 
35 namespace ripple {
36 
68 {
69  friend class Work;
70 
71 private:
72  using error_code = boost::system::error_code;
74 
75  struct Site
76  {
77  struct Status
78  {
79  clock_type::time_point refreshed;
82  };
83 
84  struct Resource
85  {
86  explicit Resource(std::string uri_);
89  };
90 
91  explicit Site(std::string uri);
92 
95 
100 
105 
106  unsigned short redirCount;
108  clock_type::time_point nextRefresh;
109  boost::optional<Status> lastRefreshStatus;
110  };
111 
114 
117 
120  boost::asio::basic_waitable_timer<clock_type> timer_;
121 
122  // A list is currently being fetched from a site
124 
125  // One or more lists are due to be fetched
128 
129  // The configured list of URIs for fetching lists
131 
132  // time to allow for requests to complete
134 
135 public:
137  Application& app,
138  boost::optional<beast::Journal> j = boost::none,
140  ~ValidatorSite();
141 
152  bool
153  load(std::vector<std::string> const& siteURIs);
154 
163  void
164  start();
165 
172  void
173  join();
174 
183  void
184  stop();
185 
189  getJson() const;
190 
191 private:
194  void
196 
198  void
199  onRequestTimeout(std::size_t siteIdx, error_code const& ec);
200 
202  void
203  onTimer(std::size_t siteIdx, error_code const& ec);
204 
206  void
207  onSiteFetch(
208  boost::system::error_code const& ec,
209  detail::response_type&& res,
210  std::size_t siteIdx);
211 
213  void
214  onTextFetch(
215  boost::system::error_code const& ec,
216  std::string const& res,
217  std::size_t siteIdx);
218 
221  void
222  makeRequest(
224  std::size_t siteIdx,
226 
229  void
231  std::string const& res,
232  std::size_t siteIdx,
234 
240  std::size_t siteIdx,
242 
245  bool
246  missingSite();
247 };
248 
249 } // namespace ripple
250 
251 #endif
std::chrono::system_clock
ripple::Application
Definition: Application.h:97
ripple::ValidatorSite::Site::lastRefreshStatus
boost::optional< Status > lastRefreshStatus
Definition: ValidatorSite.h:109
ripple::ValidatorSite::Site
Definition: ValidatorSite.h:75
ripple::ValidatorSite::Site::refreshInterval
std::chrono::minutes refreshInterval
Definition: ValidatorSite.h:107
std::string
STL class.
std::shared_ptr
STL class.
ripple::ListDisposition
ListDisposition
Definition: ValidatorList.h:43
ripple::ValidatorSite::timer_
boost::asio::basic_waitable_timer< clock_type > timer_
Definition: ValidatorSite.h:120
ripple::parsedURL
Definition: StringUtilities.h:123
ripple::ValidatorSite::onSiteFetch
void onSiteFetch(boost::system::error_code const &ec, detail::response_type &&res, std::size_t siteIdx)
Store latest list fetched from site.
Definition: ValidatorSite.cpp:473
ripple::ValidatorSite
Definition: ValidatorSite.h:67
std::vector
STL class.
ripple::ValidatorSite::stop
void stop()
Stop fetching lists from sites.
Definition: ValidatorSite.cpp:174
std::chrono::minutes
ripple::ValidatorSite::onRequestTimeout
void onRequestTimeout(std::size_t siteIdx, error_code const &ec)
request took too long
Definition: ValidatorSite.cpp:296
ripple::ValidatorSite::Site::Resource::uri
const std::string uri
Definition: ValidatorSite.h:87
ripple::ValidatorSite::work_
std::weak_ptr< detail::Work > work_
Definition: ValidatorSite.h:119
std::lock_guard
STL class.
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:427
ripple::ValidatorSite::state_mutex_
std::mutex state_mutex_
Definition: ValidatorSite.h:116
ripple::ValidatorSite::Work
friend class Work
Definition: ValidatorSite.h:69
ripple::ValidatorSite::fetching_
std::atomic< bool > fetching_
Definition: ValidatorSite.h:123
ripple::ValidatorSite::~ValidatorSite
~ValidatorSite()
Definition: ValidatorSite.cpp:102
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:112
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:343
ripple::ValidatorSite::Site::Status::refreshed
clock_type::time_point refreshed
Definition: ValidatorSite.h:79
ripple::ValidatorSite::pending_
std::atomic< bool > pending_
Definition: ValidatorSite.h:126
ripple::ValidatorSite::ValidatorSite
ValidatorSite(Application &app, boost::optional< beast::Journal > j=boost::none, std::chrono::seconds timeout=std::chrono::seconds{20})
Definition: ValidatorSite.cpp:88
ripple::ValidatorSite::getJson
Json::Value getJson() const
Return JSON representation of configured validator sites.
Definition: ValidatorSite.cpp:587
ripple::ValidatorSite::j_
const beast::Journal j_
Definition: ValidatorSite.h:113
ripple::ValidatorSite::cv_
std::condition_variable cv_
Definition: ValidatorSite.h:118
ripple::ValidatorSite::Site::Status::message
std::string message
Definition: ValidatorSite.h:81
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:167
std::atomic< bool >
ripple::ValidatorSite::sites_mutex_
std::mutex sites_mutex_
Definition: ValidatorSite.h:115
ripple::ValidatorSite::Site::redirCount
unsigned short redirCount
Definition: ValidatorSite.h:106
memory
ripple::ValidatorSite::sites_
std::vector< Site > sites_
Definition: ValidatorSite.h:130
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:222
ripple::ValidatorSite::Site::nextRefresh
clock_type::time_point nextRefresh
Definition: ValidatorSite.h:108
ripple::ValidatorSite::requestTimeout_
const std::chrono::seconds requestTimeout_
Definition: ValidatorSite.h:133
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:84
ripple::ValidatorSite::Site::activeResource
std::shared_ptr< Resource > activeResource
the active resource being requested.
Definition: ValidatorSite.h:104
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:552
ripple::ValidatorSite::Site::Status::disposition
ListDisposition disposition
Definition: ValidatorSite.h:80
ripple::ValidatorSite::Site::loadedResource
std::shared_ptr< Resource > loadedResource
the original uri as loaded from config
Definition: ValidatorSite.h:94
ripple::ValidatorSite::stopping_
std::atomic< bool > stopping_
Definition: ValidatorSite.h:127
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:120
ripple::ValidatorSite::Site::Resource::pUrl
parsedURL pUrl
Definition: ValidatorSite.h:88
ripple::ValidatorSite::Site::Status
Definition: ValidatorSite.h:77
mutex
std::size_t
ripple::ValidatorSite::start
void start()
Start fetching lists from sites.
Definition: ValidatorSite.cpp:159
ripple::ValidatorSite::onTimer
void onTimer(std::size_t siteIdx, error_code const &ec)
Fetch site whose time has come.
Definition: ValidatorSite.cpp:313
ripple::ValidatorSite::Site::startingResource
std::shared_ptr< Resource > startingResource
the resource to request at <timer> intervals.
Definition: ValidatorSite.h:99
ripple::ValidatorSite::error_code
boost::system::error_code error_code
Definition: ValidatorSite.h:72
ripple::ValidatorSite::setTimer
void setTimer(std::lock_guard< std::mutex > &)
Queue next site to be fetched lock over state_mutex_ required.
Definition: ValidatorSite.cpp:200
ripple::ValidatorSite::load
bool load(std::vector< std::string > const &siteURIs)
Load configured site URIs.
Definition: ValidatorSite.cpp:127
Json::Value
Represents a JSON value.
Definition: json_value.h:145