56 virtual std::expected<bool, Error>
57 isUpgradeRequested(boost::asio::yield_context yield) = 0;
59 virtual std::expected<ConnectionPtr, Error>
61 std::optional<boost::asio::ssl::context>& sslContext,
63 boost::asio::yield_context yield
66 virtual std::optional<Error>
68 boost::beast::http::response<boost::beast::http::string_body> response,
69 boost::asio::yield_context yield
78 std::optional<boost::beast::http::request<boost::beast::http::string_body>> request_;
84 boost::asio::ip::tcp::socket socket,
86 boost::beast::flat_buffer buffer,
95 boost::asio::ip::tcp::socket socket,
97 boost::beast::flat_buffer buffer,
98 boost::asio::ssl::context& sslCtx,
103 , stream_{std::move(socket), sslCtx}
114 sendRaw(boost::beast::http::response<boost::beast::http::string_body> response, boost::asio::yield_context yield)
117 boost::system::error_code error;
118 boost::beast::get_lowest_layer(stream_).expires_after(timeout_);
119 boost::beast::http::async_write(stream_, response, yield[error]);
126 setTimeout(std::chrono::steady_clock::duration newTimeout)
override
128 timeout_ = newTimeout;
134 auto httpResponse = std::move(response).intoHttpResponse();
135 return sendRaw(std::move(httpResponse), yield);
138 std::expected<Request, Error>
139 receive(boost::asio::yield_context yield)
override
141 if (request_.has_value()) {
142 Request result{std::move(request_).value()};
146 auto expectedRequest = fetch(yield);
147 if (expectedRequest.has_value())
148 return Request{std::move(expectedRequest).value()};
150 return std::unexpected{std::move(expectedRequest).error()};
154 close(boost::asio::yield_context yield)
override
163 [[maybe_unused]] boost::system::error_code error;
165 boost::beast::get_lowest_layer(stream_).expires_after(timeout_);
166 stream_.async_shutdown(yield[error]);
168 boost::beast::get_lowest_layer(stream_).socket().shutdown(
169 boost::asio::ip::tcp::socket::shutdown_type::shutdown_both, error
173 std::expected<bool, Error>
174 isUpgradeRequested(boost::asio::yield_context yield)
override
176 auto expectedRequest = fetch(yield);
177 if (not expectedRequest.has_value())
178 return std::unexpected{std::move(expectedRequest).error()};
180 request_ = std::move(expectedRequest).value();
182 return boost::beast::websocket::is_upgrade(request_.value());
185 std::expected<ConnectionPtr, Error>
187 [[maybe_unused]] std::optional<boost::asio::ssl::context>& sslContext,
189 boost::asio::yield_context yield
192 ASSERT(request_.has_value(),
"Request must be present to upgrade the connection");
194 if constexpr (IsSslTcpStream<StreamType>) {
195 ASSERT(sslContext.has_value(),
"SSL context must be present to upgrade the connection");
196 return makeSslWsConnection(
197 boost::beast::get_lowest_layer(stream_).release_socket(),
200 std::move(request_).value(),
206 return makePlainWsConnection(
207 stream_.release_socket(),
210 std::move(request_).value(),
218 std::expected<boost::beast::http::request<boost::beast::http::string_body>, Error>
219 fetch(boost::asio::yield_context yield)
221 boost::beast::http::request<boost::beast::http::string_body> request{};
222 boost::system::error_code error;
223 boost::beast::get_lowest_layer(stream_).expires_after(timeout_);
224 boost::beast::http::async_read(stream_, buffer_, request, yield[error]);
226 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:126