#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(); private: HTTPrequest(asio::io_context &context); void processRequest(); void writeData(std::string data); // 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(); // Request itself std::string requestType, requestPath; std::unordered_map headers, args; std::string bodyContent; // 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); private: void begin(); asio::io_context &io; asio::ip::tcp::acceptor accept; };