From a607e4c99f7ac653fca758a020b0d472c173c11d Mon Sep 17 00:00:00 2001 From: cat Date: Wed, 18 Jun 2025 01:47:58 +0300 Subject: [PATCH] Fix for adding boilerplate --- CMakeLists.txt | 10 ++++++++++ src/Entry.cpp | 16 ++++++++++++++++ src/HTTP.cpp | 34 ++++++++++++++++++++++++++++++++++ src/Webserver.cpp | 22 ++++++++++++++++++++++ src/main.hpp | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 129 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 src/Entry.cpp create mode 100644 src/HTTP.cpp create mode 100644 src/Webserver.cpp create mode 100644 src/main.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..bdcee23 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 3.10) + +project(Webserver VERSION 1.0) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_BUILD_TYPE Debug) +set(CMAKE_CXX_FLAGS "-Wall -g -fsanitize=address") + +add_executable(Webserver "src/Entry.cpp" "src/Webserver.cpp" "src/HTTP.cpp") +target_link_libraries(Webserver PRIVATE) diff --git a/src/Entry.cpp b/src/Entry.cpp new file mode 100644 index 0000000..de7ae3e --- /dev/null +++ b/src/Entry.cpp @@ -0,0 +1,16 @@ +#include "main.hpp" +#include +#include + +// Entry point a.k.a "main.cpp" +// You do not want to program here 99% of the time +int main(int argc, char *argv[]) { + try { + asio::io_context context; + Webserver server(context); + context.run(); + } catch (std::exception &e) { + std::cerr << e.what() << "\n"; + } + return 0; +} diff --git a/src/HTTP.cpp b/src/HTTP.cpp new file mode 100644 index 0000000..2a22132 --- /dev/null +++ b/src/HTTP.cpp @@ -0,0 +1,34 @@ +#include "main.hpp" + +void HTTPrequest::start() { + // Possible Logging here + readData(); +} + +void HTTPrequest::readData() { + std::shared_ptr self(shared_from_this()); + + // + // Reading happens here + // +} + +void HTTPrequest::processRequest(std::error_code ec, std::size_t size) { + // + // This is where we will process requests + // +} + +void HTTPrequest::writeData(std::string data) { + // + // Response here + // +} + +// ================= CLASS HANDLING SPECIFIC ================= + +HTTPrequest::HTTPrequest(asio::io_context &context) : sock(context) {} +asio::ip::tcp::socket &HTTPrequest::socket() { return sock; } +HTTPrequest::HTTPrequest_ptr HTTPrequest::create(asio::io_context &context) { + return HTTPrequest_ptr(new HTTPrequest(context)); +} diff --git a/src/Webserver.cpp b/src/Webserver.cpp new file mode 100644 index 0000000..8c0251c --- /dev/null +++ b/src/Webserver.cpp @@ -0,0 +1,22 @@ +#include "main.hpp" + +// Webserver is defined at main.hpp, you probably do not want to code here +Webserver::Webserver(asio::io_context &context) + : io(context), + accept(context, + asio::ip::tcp::endpoint(asio::ip::make_address(IP), PORT)) { + begin(); +} + +void Webserver::begin() { + HTTPrequest::HTTPrequest_ptr newconn = HTTPrequest::create(io); + + accept.async_accept(newconn->socket(), + [this, newconn](const asio::error_code &err) { + if (!err) { + newconn->start(); + } + + begin(); + }); +} diff --git a/src/main.hpp b/src/main.hpp new file mode 100644 index 0000000..95e6a91 --- /dev/null +++ b/src/main.hpp @@ -0,0 +1,47 @@ +#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 readData, 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 readData(); + void processRequest(std::error_code ec, std::size_t size); + void writeData(std::string data); + + 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; +};