#pragma once #include #include #include #include #include #include #include #include #include #include "common.hpp" #include "database.hpp" namespace beast = boost::beast; namespace http = beast::http; namespace net = boost::asio; class HttpSession : public std::enable_shared_from_this { public: HttpSession(net::ip::tcp::socket&& socket, std::shared_ptr db); void run(); private: void readRequest(); void onRead(beast::error_code ec, std::size_t bytes_transferred); void processRequest(http::request&& req); void writeResponse(http::response&& res); void handleError(beast::error_code ec, const char* what); beast::tcp_stream stream; beast::flat_buffer buffer; std::shared_ptr db; http::request req; }; class Server { public: Server(const std::string& address, int port, int threads, std::shared_ptr db); void run(); void stop(); private: void accept(); void onAccept(beast::error_code ec, net::ip::tcp::socket socket); net::io_context ioc; net::ip::tcp::acceptor acceptor; std::shared_ptr db; int threads; std::vector threadPool; net::steady_timer acceptTimer; };