#ifndef BELL_HTTP_SERVER_H #define BELL_HTTP_SERVER_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "BaseHTTPServer.h" #ifndef SOCK_NONBLOCK #define SOCK_NONBLOCK O_NONBLOCK #endif namespace bell { class HTTPServer : public bell::BaseHTTPServer { private: std::regex routerPattern = std::regex(":([^\\/]+)?"); fd_set master; fd_set readFds; fd_set activeFdSet, readFdSet; bool isClosed = true; bool writingResponse = false; std::map> routes; std::map connections; void writeResponse(const HTTPResponse &); void writeResponseEvents(int connFd); void findAndHandleRoute(std::string &, std::string &, int connectionFd); std::vector splitUrl(const std::string &url, char delimiter); std::mutex responseMutex; std::vector responseBuffer = std::vector(128); void readFromClient(int clientFd); std::map parseQueryString(const std::string &queryString); unsigned char h2int(char c); std::string urlDecode(std::string str); public: HTTPServer(int serverPort); void registerHandler(RequestType requestType, const std::string &, httpHandler); void respond(const HTTPResponse &); void publishEvent(std::string eventName, std::string eventData); void closeConnection(int connection); void listen(); }; } #endif