From d2fc912071c8d035645d07d24c450c40fba4066a Mon Sep 17 00:00:00 2001 From: Sithas777 Date: Wed, 13 Sep 2023 18:41:18 +0300 Subject: [PATCH] =?UTF-8?q?=D0=92=D1=82=D0=BE=D1=80=D0=B0=D1=8F=20=D1=87?= =?UTF-8?q?=D0=B0=D1=81=D1=82=D1=8C=20=20-=20=D0=B1=D0=B0=D0=B7=D0=B0=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=81=D0=B5=D1=81=D1=81=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=94=D0=BB=D1=8F=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B8=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=D0=B0=20?= =?UTF-8?q?=D0=BD=D1=83=D0=B6=D0=BD=D0=BE=20=D0=B2=D1=8B=D0=B7=D0=B2=D0=B0?= =?UTF-8?q?=D1=82=D1=8C=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8E=20req?= =?UTF-8?q?uest=5Fhandler=5F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/session.h | 8 ++++++++ src/session_base.cpp | 31 +++++++++++++++++++++++++++++-- src/session_base.h | 6 ++++++ 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/session.h b/src/session.h index d517ee6..cf84f9b 100644 --- a/src/session.h +++ b/src/session.h @@ -31,5 +31,13 @@ class Session : public SessionBase, public std::enable_shared_from_thisshared_from_this(); } + + private: + void HandleRequest(HttpRequest&& request) override; }; +template +void Session::HandleRequest(SessionBase::HttpRequest&& request) +{ + +} } // namespace http_server \ No newline at end of file diff --git a/src/session_base.cpp b/src/session_base.cpp index d913530..a72920f 100644 --- a/src/session_base.cpp +++ b/src/session_base.cpp @@ -16,10 +16,37 @@ SessionBase::SessionBase(tcp::socket&& 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); +} + } // namespace http_server diff --git a/src/session_base.h b/src/session_base.h index 9e53cfe..45e9d71 100644 --- a/src/session_base.h +++ b/src/session_base.h @@ -44,5 +44,11 @@ class SessionBase { beast::tcp_stream stream_; beast::flat_buffer buffer_; HttpRequest request_; + + void OnRead(beast::error_code ec, [[maybe_unused]] size_t bytes_read); + + void Close(); + + virtual void HandleRequest(HttpRequest&& request) = 0; }; } // namespace http_server \ No newline at end of file