#include #include #include #include #include #include #include #include #include #include #include #include #include #include #define IP "127.0.0.1" #define PORT 8000 using asocket = asio::ip::tcp::socket; using asocket_ptr = std::shared_ptr; // We handle HTTP requests with processHTTPHeader, writeData, and processRequest class HTTPrequest : public std::enable_shared_from_this { public: typedef std::shared_ptr HTTPrequest_ptr; asio::ip::tcp::socket &socket(); static HTTPrequest_ptr create(asio::io_context &context); void start(); void sendResponse(std::string status, std::string mime, std::string data); // Request itself std::string requestType, requestPath, responseText; std::unordered_map headers, args; std::string bodyContent; private: HTTPrequest(asio::io_context &context); void processRequest(); void waitForClientClose(); // Breaking Header to in lines void processHTTPHeader(); void inline processArgs(); void inline processHeaderValues(std::basic_istream &stream, std::size_t &octetCount, std::size_t headerSize); void inline processBody(); // Networking asio::ip::tcp::socket sock; asio::streambuf buffer; }; // Server manages connections/requests class Webserver : public std::enable_shared_from_this { public: Webserver(asio::io_context &context); // Responses static std::unordered_map< std::string, std::unordered_map>> responseMethods; private: void begin(); static void initResponses(); asio::io_context &io; asio::ip::tcp::acceptor accept; };