71 lines
1.7 KiB
C++
71 lines
1.7 KiB
C++
|
|
#include "session_base.hpp"
|
||
|
|
#include "logger.hpp"
|
||
|
|
#include <boost/asio/write.hpp>
|
||
|
|
|
||
|
|
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);
|
||
|
|
}
|