77 std::optional<boost::beast::http::request<boost::beast::http::string_body>> request_;
80 using MessageType = boost::beast::http::response<boost::beast::http::string_body>;
87 boost::asio::ip::tcp::socket socket,
89 boost::beast::flat_buffer buffer,
94 , stream_{std::move(socket)}
95 , sendingQueue_([
this](MessageType
const& message,
auto&& yield) {
96 boost::beast::get_lowest_layer(stream_).expires_after(timeout_);
97 boost::beast::http::async_write(stream_, message, yield);
103 boost::asio::ip::tcp::socket socket,
105 boost::beast::flat_buffer buffer,
106 boost::asio::ssl::context& sslCtx,
111 , stream_{std::move(socket), sslCtx}
112 , sendingQueue_([
this](MessageType
const& message,
auto&& yield) {
113 boost::beast::get_lowest_layer(stream_).expires_after(timeout_);
114 boost::beast::http::async_write(stream_, message, yield);
127 sslHandshake(boost::asio::yield_context yield)
130 boost::system::error_code error;
131 boost::beast::get_lowest_layer(stream_).expires_after(timeout_);
132 auto const bytesUsed =
133 stream_.async_handshake(boost::asio::ssl::stream_base::server, buffer_.cdata(), yield[error]);
137 buffer_.consume(bytesUsed);
150 boost::beast::http::response<boost::beast::http::string_body> response,
151 boost::asio::yield_context yield
154 return sendingQueue_.send(std::move(response), yield);
158 setTimeout(std::chrono::steady_clock::duration newTimeout)
override
160 timeout_ = newTimeout;
166 auto httpResponse = std::move(response).intoHttpResponse();
167 return sendRaw(std::move(httpResponse), yield);
170 std::expected<Request, Error>
171 receive(boost::asio::yield_context yield)
override
173 if (request_.has_value()) {
174 Request result{std::move(request_).value()};
178 auto expectedRequest = fetch(yield);
179 if (expectedRequest.has_value())
180 return Request{std::move(expectedRequest).value()};
182 return std::unexpected{std::move(expectedRequest).error()};
186 close(boost::asio::yield_context yield)
override
195 [[maybe_unused]] boost::system::error_code error;
197 boost::beast::get_lowest_layer(stream_).expires_after(timeout_);
198 stream_.async_shutdown(yield[error]);
200 boost::beast::get_lowest_layer(stream_).socket().shutdown(
201 boost::asio::ip::tcp::socket::shutdown_type::shutdown_both, error
205 std::expected<bool, Error>
206 isUpgradeRequested(boost::asio::yield_context yield)
override
208 auto expectedRequest = fetch(yield);
209 if (not expectedRequest.has_value())
210 return std::unexpected{std::move(expectedRequest).error()};
212 request_ = std::move(expectedRequest).value();
214 return boost::beast::websocket::is_upgrade(request_.value());
217 std::expected<ConnectionPtr, Error>
220 ASSERT(request_.has_value(),
"Request must be present to upgrade the connection");
222 return makeWsConnection(
226 std::move(request_).value(),
233 std::expected<boost::beast::http::request<boost::beast::http::string_body>, Error>
234 fetch(boost::asio::yield_context yield)
236 boost::beast::http::request<boost::beast::http::string_body> request{};
237 boost::system::error_code error;
238 boost::beast::get_lowest_layer(stream_).expires_after(timeout_);
239 boost::beast::http::async_read(stream_, buffer_, request, yield[error]);
241 return std::unexpected{error};
void setTimeout(std::chrono::steady_clock::duration newTimeout) override
Get the timeout for send, receive, and close operations. For WebSocket connections,...
Definition HttpConnection.hpp:158