#include "session_base.hpp" #include "logger.hpp" #include SessionBase::SessionBase(TcpSocket socket) : socket_(std::move(socket)) { } void SessionBase::start() { doRead(); } void SessionBase::doRead() { using namespace boost::asio; auto self = shared_from_this(); auto handler = [this, self](ErrorCode ec, std::size_t bytesTransferred) { onRead(ec, bytesTransferred); }; socket_.async_read_some(buffer(buffer_), handler); } void SessionBase::onRead(ErrorCode ec, std::size_t bytesTransferred) { if (ec) { Logger::error("Read error: " + ec.message()); return; } std::string rawRequest(buffer_.data(), bytesTransferred); Logger::info("Received request:\n" + rawRequest); try { handleRequest(rawRequest); } catch (const std::exception &ex) { Logger::error(std::string("Request handling failed: ") + ex.what()); } } void SessionBase::doWrite(const std::string &response) { using namespace boost::asio; auto self = shared_from_this(); auto onWriteHandler = [this, self](ErrorCode ec, std::size_t /*bytesTransferred*/) { if (ec) { Logger::error("Write error: " + ec.message()); } ErrorCode shutdownEc; if (socket_.shutdown(TcpSocket::shutdown_both, shutdownEc)) { Logger::warn("Shutdown error: " + shutdownEc.message()); } ErrorCode closeEc; if (socket_.close(closeEc)) { Logger::warn("Close error: " + closeEc.message()); } else { Logger::info("Connection closed"); } }; async_write(socket_, buffer(response), onWriteHandler); }