22#include "util/WithTimeout.hpp"
23#include "util/requests/Types.hpp"
24#include "util/requests/WsConnection.hpp"
26#include <boost/asio/associated_executor.hpp>
27#include <boost/asio/bind_cancellation_slot.hpp>
28#include <boost/asio/buffer.hpp>
29#include <boost/asio/cancellation_signal.hpp>
30#include <boost/asio/cancellation_type.hpp>
31#include <boost/asio/spawn.hpp>
32#include <boost/asio/steady_timer.hpp>
33#include <boost/beast/core/buffers_to_string.hpp>
34#include <boost/beast/core/error.hpp>
35#include <boost/beast/core/flat_buffer.hpp>
36#include <boost/beast/core/tcp_stream.hpp>
37#include <boost/beast/ssl/ssl_stream.hpp>
38#include <boost/beast/websocket/rfc6455.hpp>
39#include <boost/beast/websocket/stream.hpp>
40#include <boost/beast/websocket/stream_base.hpp>
41#include <boost/system/errc.hpp>
51namespace util::requests::impl {
53template <
typename StreamType>
62 std::expected<std::string, RequestError>
63 read(boost::asio::yield_context yield, std::optional<std::chrono::steady_clock::duration> timeout = std::nullopt)
66 boost::beast::error_code errorCode;
67 boost::beast::flat_buffer buffer;
69 auto operation = [&](
auto&& token) { ws_.async_read(buffer, token); };
73 operation(yield[errorCode]);
77 return std::unexpected{
RequestError{
"Read error", errorCode}};
79 return boost::beast::buffers_to_string(std::move(buffer).
data());
82 std::optional<RequestError>
84 std::string
const& message,
85 boost::asio::yield_context yield,
86 std::optional<std::chrono::steady_clock::duration> timeout = std::nullopt
89 boost::beast::error_code errorCode;
90 auto operation = [&](
auto&& token) { ws_.async_write(boost::asio::buffer(message), token); };
94 operation(yield[errorCode]);
103 std::optional<RequestError>
108 boost::beast::websocket::stream_base::timeout wsTimeout{};
109 ws_.get_option(wsTimeout);
110 wsTimeout.handshake_timeout = timeout;
111 ws_.set_option(wsTimeout);
113 boost::beast::error_code errorCode;
114 ws_.async_close(boost::beast::websocket::close_code::normal, yield[errorCode]);
121using PlainWsConnection = WsConnectionImpl<boost::beast::websocket::stream<boost::beast::tcp_stream>>;
122using SslWsConnection =
123 WsConnectionImpl<boost::beast::websocket::stream<boost::beast::ssl_stream<boost::beast::tcp_stream>>>;
Error type for HTTP requests.
Definition Types.hpp:34
Interface for WebSocket connections. It is used to hide SSL and plain connections behind the same int...
Definition WsConnection.hpp:48
static constexpr std::chrono::seconds kDEFAULT_TIMEOUT
Definition WsConnection.hpp:90
Definition WsConnectionImpl.hpp:54
std::optional< RequestError > close(boost::asio::yield_context yield, std::chrono::steady_clock::duration const timeout=kDEFAULT_TIMEOUT) override
Close the WebSocket.
Definition WsConnectionImpl.hpp:104
std::optional< RequestError > write(std::string const &message, boost::asio::yield_context yield, std::optional< std::chrono::steady_clock::duration > timeout=std::nullopt) override
Write a message to the WebSocket.
Definition WsConnectionImpl.hpp:83
std::expected< std::string, RequestError > read(boost::asio::yield_context yield, std::optional< std::chrono::steady_clock::duration > timeout=std::nullopt) override
Read a message from the WebSocket.
Definition WsConnectionImpl.hpp:63
This namespace implements the data access layer and related components.
Definition AmendmentCenter.cpp:70
boost::system::error_code withTimeout(Operation &&operation, boost::asio::yield_context yield, std::chrono::steady_clock::duration timeout)
Perform a coroutine operation with a timeout.
Definition WithTimeout.hpp:49