diff --git a/main.cpp b/main.cpp index aae055b..8dbcddd 100644 --- a/main.cpp +++ b/main.cpp @@ -88,7 +88,7 @@ int main() constexpr net::ip::port_type port = 8080; http_server::ServeHttp(ioc, {address, port}, [](auto&& req, auto&& sender) { - // sender(HandleRequest(std::forward(req))); + sender(HandleRequest(std::forward(req))); }); net::steady_timer t {ioc, 30s}; diff --git a/src/http_server.h b/src/http_server.h index 308eb3f..72ed644 100644 --- a/src/http_server.h +++ b/src/http_server.h @@ -16,6 +16,8 @@ namespace http_server template void ServeHttp(net::io_context& ioc, const tcp::endpoint& endpoint, RequestHandler&& handler) { - // Напишите недостающий код, используя информацию из урока + using MyListener = Listener>; + + std::make_shared(ioc, endpoint, std::forward(handler))->Run(); } } diff --git a/src/session.h b/src/session.h index fc3bf2b..4d378df 100644 --- a/src/session.h +++ b/src/session.h @@ -33,6 +33,13 @@ class Session : public SessionBase, public std::enable_shared_from_thisshared_from_this()](auto&& response) { + self->Write(std::move(response)); + }); + } }; } // namespace http_server \ No newline at end of file diff --git a/src/session_base.cpp b/src/session_base.cpp index a72920f..6db3fce 100644 --- a/src/session_base.cpp +++ b/src/session_base.cpp @@ -6,11 +6,12 @@ namespace http_server { -void ReportError(beast::error_code ec, std::string_view what) { +void ReportError(beast::error_code ec, std::string_view what) +{ std::cerr << what << ": "sv << ec.message() << std::endl; } SessionBase::SessionBase(tcp::socket&& socket) -: stream_(std::move(socket)) + : stream_(std::move(socket)) { } @@ -49,4 +50,21 @@ void SessionBase::Close() stream_.socket().shutdown(tcp::socket::shutdown_send, ec); } +void SessionBase::OnWrite(bool close, + boost::beast::error_code ec, + std::size_t bytes_written) +{ + if (ec) { + return ReportError(ec, "write"sv); + } + + if (close) { + // Семантика ответа требует закрыть соединение + return Close(); + } + + // Считываем следующий запрос + Read(); +} + } // namespace http_server diff --git a/src/session_base.h b/src/session_base.h index 45e9d71..7441d69 100644 --- a/src/session_base.h +++ b/src/session_base.h @@ -40,6 +40,18 @@ class SessionBase { protected: explicit SessionBase(tcp::socket&& socket); + template + void Write(http::response&& response) { + // Запись выполняется асинхронно, поэтому response перемещаем в область кучи + auto safe_response = std::make_shared>(std::move(response)); + + auto self = GetSharedThis(); + http::async_write(stream_, *safe_response, + [safe_response, self](beast::error_code ec, std::size_t bytes_written) { + self->OnWrite(safe_response->need_eof(), ec, bytes_written); + }); + } + private: beast::tcp_stream stream_; beast::flat_buffer buffer_; @@ -50,5 +62,7 @@ class SessionBase { void Close(); virtual void HandleRequest(HttpRequest&& request) = 0; + + void OnWrite(bool close, beast::error_code ec, [[maybe_unused]] std::size_t bytes_written); }; } // namespace http_server \ No newline at end of file