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