#ifndef HTTPSERVER_HPP #define HTTPSERVER_HPP #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace pmc { namespace net { namespace beast = boost::beast; namespace http = beast::http; namespace asio = boost::asio; using tcp = boost::asio::ip::tcp; using HttpRequestHandler = std::function( const http::request&, const std::unordered_map&)>; using MiddlewareHandler = std::function&, http::response&, const std::unordered_map&)>; struct RouteEntry { std::string path; std::regex pattern; HttpRequestHandler handler; bool is_wildcard; }; class HttpServer { public: explicit HttpServer(const std::string& address, unsigned short port, unsigned int threads = 1); explicit HttpServer(const std::string& address, unsigned short port, const std::string& cert_file, const std::string& key_file, unsigned int threads = 1); ~HttpServer(); void start(); void stop(); void get(const std::string& path, HttpRequestHandler handler); void post(const std::string& path, HttpRequestHandler handler); void put(const std::string& path, HttpRequestHandler handler); void del(const std::string& path, HttpRequestHandler handler); void use(MiddlewareHandler middleware); void setStaticDirectory(const std::string& path); bool isRunning() const; unsigned short getPort() const; std::string getAddress() const; bool isSSLEnabled() const; void run(); void showStatus() const; void setPrivateKeyPassword(const std::string& password); class debug { public: static void print_all_header_fields(const http::request& req); }; private: class Session; class Listener; std::string address_; unsigned short port_; unsigned int threads_; std::atomic running_{false}; bool ssl_enabled_{false}; std::string cert_file_; std::string key_file_; std::string private_key_password_; std::unique_ptr ssl_ctx_; std::unique_ptr ioc_; std::shared_ptr listener_; std::vector worker_threads_; std::vector get_handlers_; std::vector post_handlers_; std::vector put_handlers_; std::vector delete_handlers_; std::vector middlewares_; std::string static_directory_; std::vector> sessions_; std::mutex sessions_mutex_; std::unordered_map parseQueryParams(const std::string& query); std::regex wildcardToRegex(const std::string& pattern); bool matchPath(const std::string& path, const std::regex& pattern); http::response handleRequest(const http::request& req); HttpRequestHandler findRoute(const std::string& method, const std::string& path); void addSession(const std::shared_ptr& session); void removeSession(const Session* session); void closeAllSessions(); void initSSLContext(); }; } // namespace net } // namespace pmc #endif // HTTPSERVER_HPP