#pragma once #include "sdk.h" // boost.beast будет использовать std::string_view вместо boost::string_view #define BOOST_BEAST_USE_STD_STRING_VIEW #include #include #include #include #include "session_base.h" namespace http_server { namespace net = boost::asio; using tcp = net::ip::tcp; namespace beast = boost::beast; namespace http = beast::http; template class Session : public SessionBase, public std::enable_shared_from_this> { RequestHandler request_handler_; public: template Session(tcp::socket&& socket, Handler&& request_handler) : SessionBase(std::move(socket)), request_handler_(request_handler) {} std::shared_ptr GetSharedThis() override { return this->shared_from_this(); } private: void HandleRequest(HttpRequest&& request) override { // Захватываем умный указатель на текущий объект Session в лямбде, // чтобы продлить время жизни сессии до вызова лямбды. // Используется generic-лямбда функция, способная принять response произвольного типа request_handler_(std::move(request), [self = this->shared_from_this()](auto&& response) { self->Write(std::move(response)); }); } }; } // namespace http_server