Clio  develop
The XRP Ledger API server.
Loading...
Searching...
No Matches
WsConnection.hpp
1#pragma once
2
3#include "util/log/Logger.hpp"
4#include "util/requests/Types.hpp"
5
6#include <boost/asio/bind_cancellation_slot.hpp>
7#include <boost/asio/cancellation_signal.hpp>
8#include <boost/asio/cancellation_type.hpp>
9#include <boost/asio/io_context.hpp>
10#include <boost/asio/spawn.hpp>
11#include <boost/beast/core/tcp_stream.hpp>
12#include <boost/beast/websocket/stream.hpp>
13
14#include <chrono>
15#include <expected>
16#include <memory>
17#include <optional>
18#include <string>
19#include <utility>
20#include <vector>
21
22namespace util::requests {
23
31public:
32 virtual ~WsConnection() = default;
33
41 virtual std::expected<std::string, RequestError>
43 boost::asio::yield_context yield,
44 std::optional<std::chrono::steady_clock::duration> timeout = std::nullopt
45 ) = 0;
46
55 virtual std::optional<RequestError>
57 std::string const& message,
58 boost::asio::yield_context yield,
59 std::optional<std::chrono::steady_clock::duration> timeout = std::nullopt
60 ) = 0;
61
69 virtual std::optional<RequestError>
71 boost::asio::yield_context yield,
72 std::chrono::steady_clock::duration timeout = kDEFAULT_TIMEOUT
73 ) = 0;
74
75 static constexpr std::chrono::seconds kDEFAULT_TIMEOUT{
76 5
77 };
78};
79using WsConnectionPtr = std::unique_ptr<WsConnection>;
80
85 util::Logger log_{"WsConnectionBuilder"};
86 std::string host_;
87 std::string port_;
88 std::vector<HttpHeader> headers_;
89 std::chrono::steady_clock::duration connectionTimeout_{kDEFAULT_TIMEOUT};
90 std::chrono::steady_clock::duration wsHandshakeTimeout_{kDEFAULT_TIMEOUT};
91 std::string target_{"/"};
92
93public:
100 WsConnectionBuilder(std::string host, std::string port);
101
109 addHeader(HttpHeader header);
110
118 addHeaders(std::vector<HttpHeader> headers);
119
127 setTarget(std::string target);
128
136 setConnectionTimeout(std::chrono::steady_clock::duration timeout);
137
145 setWsHandshakeTimeout(std::chrono::steady_clock::duration timeout);
146
153 std::expected<WsConnectionPtr, RequestError>
154 sslConnect(boost::asio::yield_context yield) const;
155
162 std::expected<WsConnectionPtr, RequestError>
163 plainConnect(boost::asio::yield_context yield) const;
164
171 std::expected<WsConnectionPtr, RequestError>
172 connect(boost::asio::yield_context yield) const;
173
174 static constexpr std::chrono::seconds kDEFAULT_TIMEOUT{
175 5
176 };
177
178private:
179 template <typename StreamDataType>
180 std::expected<WsConnectionPtr, RequestError>
181 connectImpl(StreamDataType&& streamData, boost::asio::yield_context yield) const;
182};
183
184} // namespace util::requests
A simple thread-safe logger for the channel specified in the constructor.
Definition Logger.hpp:77
std::expected< WsConnectionPtr, RequestError > connect(boost::asio::yield_context yield) const
Connect to the host trying SSL first then plain if SSL fails.
Definition WsConnection.cpp:106
std::expected< WsConnectionPtr, RequestError > plainConnect(boost::asio::yield_context yield) const
Connect to the host without SSL asynchronously.
Definition WsConnection.cpp:100
WsConnectionBuilder(std::string host, std::string port)
Create a new connection builder.
Definition WsConnection.cpp:35
static constexpr std::chrono::seconds kDEFAULT_TIMEOUT
Definition WsConnection.hpp:174
WsConnectionBuilder & setConnectionTimeout(std::chrono::steady_clock::duration timeout)
Set the timeout for connection establishing operations. Default is 5 seconds.
Definition WsConnection.cpp:66
WsConnectionBuilder & setTarget(std::string target)
Set the target of the request.
Definition WsConnection.cpp:59
WsConnectionBuilder & addHeader(HttpHeader header)
Add a header to the request.
Definition WsConnection.cpp:41
std::expected< WsConnectionPtr, RequestError > sslConnect(boost::asio::yield_context yield) const
Connect to the host using SSL asynchronously.
Definition WsConnection.cpp:80
WsConnectionBuilder & setWsHandshakeTimeout(std::chrono::steady_clock::duration timeout)
Set the timeout for WebSocket handshake. Default is 5 seconds.
Definition WsConnection.cpp:73
WsConnectionBuilder & addHeaders(std::vector< HttpHeader > headers)
Add multiple headers to the request.
Definition WsConnection.cpp:48
Interface for WebSocket connections. It is used to hide SSL and plain connections behind the same int...
Definition WsConnection.hpp:30
static constexpr std::chrono::seconds kDEFAULT_TIMEOUT
Definition WsConnection.hpp:75
virtual std::optional< RequestError > close(boost::asio::yield_context yield, std::chrono::steady_clock::duration timeout=kDEFAULT_TIMEOUT)=0
Close the WebSocket.
virtual std::optional< RequestError > write(std::string const &message, boost::asio::yield_context yield, std::optional< std::chrono::steady_clock::duration > timeout=std::nullopt)=0
Write a message to the WebSocket.
virtual std::expected< std::string, RequestError > read(boost::asio::yield_context yield, std::optional< std::chrono::steady_clock::duration > timeout=std::nullopt)=0
Read a message from the WebSocket.
HTTP header.
Definition Types.hpp:51