58 virtual std::expected<bool, Error>
59 isUpgradeRequested(boost::asio::yield_context yield) = 0;
61 virtual std::expected<ConnectionPtr, Error>
64 virtual std::optional<Error>
66 boost::beast::http::response<boost::beast::http::string_body> response,
67 boost::asio::yield_context yield
76 std::optional<boost::beast::http::request<boost::beast::http::string_body>> request_;
82 boost::asio::ip::tcp::socket socket,
84 boost::beast::flat_buffer buffer,
93 boost::asio::ip::tcp::socket socket,
95 boost::beast::flat_buffer buffer,
96 boost::asio::ssl::context& sslCtx,
101 , stream_{std::move(socket), sslCtx}
106 sslHandshake(boost::asio::yield_context yield)
109 boost::system::error_code error;
110 boost::beast::get_lowest_layer(stream_).expires_after(timeout_);
111 auto const bytesUsed =
112 stream_.async_handshake(boost::asio::ssl::stream_base::server, buffer_.cdata(), yield[error]);
116 buffer_.consume(bytesUsed);
128 sendRaw(boost::beast::http::response<boost::beast::http::string_body> response, boost::asio::yield_context yield)
131 boost::system::error_code error;
132 boost::beast::get_lowest_layer(stream_).expires_after(timeout_);
133 boost::beast::http::async_write(stream_, response, yield[error]);
140 setTimeout(std::chrono::steady_clock::duration newTimeout)
override
142 timeout_ = newTimeout;
148 auto httpResponse = std::move(response).intoHttpResponse();
149 return sendRaw(std::move(httpResponse), yield);
152 std::expected<Request, Error>
153 receive(boost::asio::yield_context yield)
override
155 if (request_.has_value()) {
156 Request result{std::move(request_).value()};
160 auto expectedRequest = fetch(yield);
161 if (expectedRequest.has_value())
162 return Request{std::move(expectedRequest).value()};
164 return std::unexpected{std::move(expectedRequest).error()};
168 close(boost::asio::yield_context yield)
override
177 [[maybe_unused]] boost::system::error_code error;
179 boost::beast::get_lowest_layer(stream_).expires_after(timeout_);
180 stream_.async_shutdown(yield[error]);
182 boost::beast::get_lowest_layer(stream_).socket().shutdown(
183 boost::asio::ip::tcp::socket::shutdown_type::shutdown_both, error
187 std::expected<bool, Error>
188 isUpgradeRequested(boost::asio::yield_context yield)
override
190 auto expectedRequest = fetch(yield);
191 if (not expectedRequest.has_value())
192 return std::unexpected{std::move(expectedRequest).error()};
194 request_ = std::move(expectedRequest).value();
196 return boost::beast::websocket::is_upgrade(request_.value());
199 std::expected<ConnectionPtr, Error>
202 ASSERT(request_.has_value(),
"Request must be present to upgrade the connection");
204 return makeWsConnection(
208 std::move(request_).value(),
215 std::expected<boost::beast::http::request<boost::beast::http::string_body>, Error>
216 fetch(boost::asio::yield_context yield)
218 boost::beast::http::request<boost::beast::http::string_body> request{};
219 boost::system::error_code error;
220 boost::beast::get_lowest_layer(stream_).expires_after(timeout_);
221 boost::beast::http::async_read(stream_, buffer_, request, yield[error]);
223 return std::unexpected{error};
Connection(std::string ip, boost::beast::flat_buffer buffer, util::TagDecoratorFactory const &tagDecoratorFactory)
Construct a new Connection object.
Definition Connection.cpp:48
void setTimeout(std::chrono::steady_clock::duration newTimeout) override
Get the timeout for send, receive, and close operations. For WebSocket connections,...
Definition HttpConnection.hpp:140