rippled
HTTPStream.h
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2020 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_NET_HTTPSTREAM_H_INCLUDED
21 #define RIPPLE_NET_HTTPSTREAM_H_INCLUDED
22 
23 #include <ripple/core/Config.h>
24 #include <ripple/net/HTTPClientSSLContext.h>
25 
26 #include <boost/asio/spawn.hpp>
27 #include <boost/asio/strand.hpp>
28 #include <boost/beast/core.hpp>
29 #include <boost/beast/http.hpp>
30 
31 #include <optional>
32 
33 namespace ripple {
34 
36 {
37 public:
38  using request = boost::beast::http::request<boost::beast::http::empty_body>;
39  using parser = boost::beast::http::basic_parser<false>;
40 
41  virtual ~HTTPStream() = default;
42 
43  [[nodiscard]] virtual boost::asio::ip::tcp::socket&
44  getStream() = 0;
45 
46  [[nodiscard]] virtual bool
47  connect(
48  std::string& errorOut,
49  std::string const& host,
50  std::string const& port,
51  boost::asio::yield_context& yield) = 0;
52 
53  virtual void
54  asyncWrite(
55  request& req,
56  boost::asio::yield_context& yield,
57  boost::system::error_code& ec) = 0;
58 
59  virtual void
60  asyncRead(
61  boost::beast::flat_buffer& buf,
62  parser& p,
63  boost::asio::yield_context& yield,
64  boost::system::error_code& ec) = 0;
65 
66  virtual void
68  boost::beast::flat_buffer& buf,
69  parser& p,
70  boost::asio::yield_context& yield,
71  boost::system::error_code& ec) = 0;
72 };
73 
74 class SSLStream : public HTTPStream
75 {
76 public:
77  SSLStream(
78  Config const& config,
79  boost::asio::io_service::strand& strand,
80  beast::Journal j);
81 
82  virtual ~SSLStream() = default;
83 
84  boost::asio::ip::tcp::socket&
85  getStream() override;
86 
87  bool
88  connect(
89  std::string& errorOut,
90  std::string const& host,
91  std::string const& port,
92  boost::asio::yield_context& yield) override;
93 
94  void
95  asyncWrite(
96  request& req,
97  boost::asio::yield_context& yield,
98  boost::system::error_code& ec) override;
99 
100  void
101  asyncRead(
102  boost::beast::flat_buffer& buf,
103  parser& p,
104  boost::asio::yield_context& yield,
105  boost::system::error_code& ec) override;
106 
107  void
109  boost::beast::flat_buffer& buf,
110  parser& p,
111  boost::asio::yield_context& yield,
112  boost::system::error_code& ec) override;
113 
114 private:
118  boost::asio::io_service::strand& strand_;
119 };
120 
121 class RawStream : public HTTPStream
122 {
123 public:
124  RawStream(boost::asio::io_service::strand& strand);
125 
126  virtual ~RawStream() = default;
127 
128  boost::asio::ip::tcp::socket&
129  getStream() override;
130 
131  bool
132  connect(
133  std::string& errorOut,
134  std::string const& host,
135  std::string const& port,
136  boost::asio::yield_context& yield) override;
137 
138  void
139  asyncWrite(
140  request& req,
141  boost::asio::yield_context& yield,
142  boost::system::error_code& ec) override;
143 
144  void
145  asyncRead(
146  boost::beast::flat_buffer& buf,
147  parser& p,
148  boost::asio::yield_context& yield,
149  boost::system::error_code& ec) override;
150 
151  void
153  boost::beast::flat_buffer& buf,
154  parser& p,
155  boost::asio::yield_context& yield,
156  boost::system::error_code& ec) override;
157 
158 private:
160  boost::asio::io_service::strand& strand_;
161 };
162 
163 } // namespace ripple
164 
165 #endif // RIPPLE_NET_HTTPSTREAM_H
ripple::RawStream::asyncRead
void asyncRead(boost::beast::flat_buffer &buf, parser &p, boost::asio::yield_context &yield, boost::system::error_code &ec) override
Definition: HTTPStream.cpp:184
ripple::RawStream::stream_
std::optional< boost::asio::ip::tcp::socket > stream_
Definition: HTTPStream.h:159
ripple::SSLStream::asyncReadSome
void asyncReadSome(boost::beast::flat_buffer &buf, parser &p, boost::asio::yield_context &yield, boost::system::error_code &ec) override
Definition: HTTPStream.cpp:113
std::string
STL class.
ripple::HTTPStream
Definition: HTTPStream.h:35
ripple::RawStream::asyncWrite
void asyncWrite(request &req, boost::asio::yield_context &yield, boost::system::error_code &ec) override
Definition: HTTPStream.cpp:175
ripple::RawStream::RawStream
RawStream(boost::asio::io_service::strand &strand)
Definition: HTTPStream.cpp:122
ripple::SSLStream::~SSLStream
virtual ~SSLStream()=default
ripple::SSLStream::getStream
boost::asio::ip::tcp::socket & getStream() override
Definition: HTTPStream.cpp:34
ripple::HTTPStream::parser
boost::beast::http::basic_parser< false > parser
Definition: HTTPStream.h:39
ripple::HTTPStream::connect
virtual bool connect(std::string &errorOut, std::string const &host, std::string const &port, boost::asio::yield_context &yield)=0
ripple::HTTPStream::getStream
virtual boost::asio::ip::tcp::socket & getStream()=0
ripple::RawStream
Definition: HTTPStream.h:121
ripple::RawStream::getStream
boost::asio::ip::tcp::socket & getStream() override
Definition: HTTPStream.cpp:127
ripple::HTTPStream::~HTTPStream
virtual ~HTTPStream()=default
ripple::SSLStream::asyncWrite
void asyncWrite(request &req, boost::asio::yield_context &yield, boost::system::error_code &ec) override
Definition: HTTPStream.cpp:94
ripple::Config
Definition: Config.h:89
ripple::RawStream::strand_
boost::asio::io_service::strand & strand_
Definition: HTTPStream.h:160
beast::Journal
A generic endpoint for log messages.
Definition: Journal.h:58
ripple::SSLStream
Definition: HTTPStream.h:74
ripple::HTTPStream::asyncReadSome
virtual void asyncReadSome(boost::beast::flat_buffer &buf, parser &p, boost::asio::yield_context &yield, boost::system::error_code &ec)=0
ripple::HTTPStream::asyncWrite
virtual void asyncWrite(request &req, boost::asio::yield_context &yield, boost::system::error_code &ec)=0
ripple::SSLStream::strand_
boost::asio::io_service::strand & strand_
Definition: HTTPStream.h:118
ripple::HTTPClientSSLContext
Definition: HTTPClientSSLContext.h:34
ripple::HTTPStream::asyncRead
virtual void asyncRead(boost::beast::flat_buffer &buf, parser &p, boost::asio::yield_context &yield, boost::system::error_code &ec)=0
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::SSLStream::SSLStream
SSLStream(Config const &config, boost::asio::io_service::strand &strand, beast::Journal j)
Definition: HTTPStream.cpp:24
ripple::RawStream::~RawStream
virtual ~RawStream()=default
ripple::SSLStream::asyncRead
void asyncRead(boost::beast::flat_buffer &buf, parser &p, boost::asio::yield_context &yield, boost::system::error_code &ec) override
Definition: HTTPStream.cpp:103
ripple::RawStream::asyncReadSome
void asyncReadSome(boost::beast::flat_buffer &buf, parser &p, boost::asio::yield_context &yield, boost::system::error_code &ec) override
Definition: HTTPStream.cpp:194
ripple::RawStream::connect
bool connect(std::string &errorOut, std::string const &host, std::string const &port, boost::asio::yield_context &yield) override
Definition: HTTPStream.cpp:134
ripple::SSLStream::ssl_ctx_
HTTPClientSSLContext ssl_ctx_
Definition: HTTPStream.h:115
ripple::SSLStream::connect
bool connect(std::string &errorOut, std::string const &host, std::string const &port, boost::asio::yield_context &yield) override
Definition: HTTPStream.cpp:41
optional
ripple::SSLStream::stream_
std::optional< boost::asio::ssl::stream< boost::asio::ip::tcp::socket > > stream_
Definition: HTTPStream.h:117
ripple::HTTPStream::request
boost::beast::http::request< boost::beast::http::empty_body > request
Definition: HTTPStream.h:38