#include "http_server.h" #include "session_base.h" #include #include namespace http_server { 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)) { } void SessionBase::Run() { net::dispatch(stream_.get_executor(), beast::bind_front_handler(&SessionBase::Read, GetSharedThis())); } void SessionBase::Read() { using namespace std::literals; request_ = {}; stream_.expires_after(30s); http::async_read(stream_, buffer_, request_, beast::bind_front_handler(&SessionBase::OnRead, GetSharedThis())); } void SessionBase::OnRead(beast::error_code ec, size_t bytes_read) { if (ec == http::error::end_of_stream) { return Close(); } if (ec) { return ReportError(ec, "read"sv); } HandleRequest(std::move(request_)); } void SessionBase::Close() { beast::error_code ec; 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