From ece000faad7604b8ea45097b66cc608a5d6b9c60 Mon Sep 17 00:00:00 2001 From: LeonardoBizzoni Date: Tue, 13 Aug 2024 18:34:44 +0200 Subject: [PATCH] Started working on listening for HTTP trafic --- src/http.h | 8 +++++--- src/listener.cpp | 16 ++++++++++++++++ src/listener.h | 29 +++++++++++++++++++++++++++++ src/main.cpp | 39 ++++++--------------------------------- src/request.cpp | 10 ++++++++++ src/request.h | 5 ++++- src/send.cpp | 6 +++--- 7 files changed, 73 insertions(+), 40 deletions(-) create mode 100644 src/listener.cpp create mode 100644 src/listener.h create mode 100644 src/request.cpp diff --git a/src/http.h b/src/http.h index f54a97a..c3bf9ae 100644 --- a/src/http.h +++ b/src/http.h @@ -1,23 +1,25 @@ #pragma once #include + #include "error.h" #include "method.h" #include "request.h" #include "response.h" +#include "listener.h" #define ERR(error) std::unexpected(error) #define NEW_LINE std::string_view("\r\n") namespace http { - std::expected send(Method, const RequestOpts& req); + std::expected send(Method, const Request& req); std::expected connect(const std::string_view& domain_name, const uint16_t port = 80); - std::string build_request(Method method, const RequestOpts &req); + std::string build_request(Method method, const Request &req); std::expected read_raw_response(const int8_t socketfd); namespace async { - std::future> send(Method method, const RequestOpts &req); + std::future> send(Method method, const Request &req); } } // namespace http diff --git a/src/listener.cpp b/src/listener.cpp new file mode 100644 index 0000000..7bdb656 --- /dev/null +++ b/src/listener.cpp @@ -0,0 +1,16 @@ +#include "listener.h" + +namespace http { + std::expected Listener::create_on_local(uint16_t port) { + Listener server; + + ++port; + + return server; + } + + + void Listener::serve() { + + } +} // namespace http diff --git a/src/listener.h b/src/listener.h new file mode 100644 index 0000000..489d5a6 --- /dev/null +++ b/src/listener.h @@ -0,0 +1,29 @@ +#pragma once + +#include +#include +#include +#include +#include + +#include "error.h" +#include "request.h" + +namespace http { + struct Listener { + public: + ~Listener() {} + + static std::expected create_on_local(uint16_t port); + static std::expected create_on_lan(uint16_t port); + + void serve(); + void serve_async(); + + private: + Listener() : routes({}) {} + + public: + std::unordered_map> routes; + }; +} // namespace http diff --git a/src/main.cpp b/src/main.cpp index 66a11bc..5fdd54f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,38 +3,11 @@ #include "http.h" int main() { - auto resp1 = http::async::send(http::Method::GET, {.domain_name = "example.com", - .version = {1, 1}}); + auto server = http::Listener::create_on_local(8800); + server.value().serve(); - auto resp = resp1.get(); - if (!resp.has_value()) { - switch (resp.error()) { - case http::Error::SocketCreation: { - std::cout << "Socket creation" << std::endl; - } break; - case http::Error::SocketConnection: { - std::cout << "Socket connection" << std::endl; - } break; - case http::Error::DNSResolution: { - std::cout << "DNS resolution" << std::endl; - } break; - case http::Error::ServerNotFound: { - std::cout << "Server not found" << std::endl; - } break; - case http::Error::InvalidRead: { - std::cout << "Invalid read" << std::endl; - } break; - case http::Error::InvalidResponse: { - std::cout << "Invalid response" << std::endl; - } break; - case http::Error::InvalidResponseHTTPVersion: { - std::cout << "Invalid response http version" << std::endl; - } break; - case http::Error::InvalidResponseStatusCode: { - std::cout << "Invalid response status code" << std::endl; - } break; - } - } else { - std::cout << resp.value() << std::endl; - } + server.value().routes["prova"] = [](const http::Request &req) { std::cout << req << std::endl; }; + + http::Request request; + server.value().routes["prova"](request); } diff --git a/src/request.cpp b/src/request.cpp new file mode 100644 index 0000000..5908c2b --- /dev/null +++ b/src/request.cpp @@ -0,0 +1,10 @@ +#include "request.h" + +#include + +std::ostream &operator<<(std::ostream &os, const http::Request &req) { + return os << "Request { domain: " << std::quoted(req.domain_name) << ", port: " << req.port + << ", host: " << std::quoted(req.host) << ", query: " << std::quoted(req.query) + << ", accept: " << std::quoted(req.accept) << ", body: " << std::quoted(req.body) + << " }"; +} diff --git a/src/request.h b/src/request.h index e6c168f..262261b 100644 --- a/src/request.h +++ b/src/request.h @@ -2,6 +2,7 @@ #include #include +#include namespace http { struct http_version { @@ -9,7 +10,7 @@ namespace http { uint8_t minor = 1; }; - struct RequestOpts { + struct Request { uint16_t port = 80; std::string_view domain_name; std::string_view host = domain_name; @@ -20,3 +21,5 @@ namespace http { http_version version = {.major = 1, .minor = 1}; }; } // namespace http + +std::ostream &operator<<(std::ostream &os, const http::Request &req); diff --git a/src/send.cpp b/src/send.cpp index 557158e..4be2fd1 100644 --- a/src/send.cpp +++ b/src/send.cpp @@ -74,7 +74,7 @@ namespace http { return remote_socketfd; } - std::expected send(Method method, const RequestOpts &req) { + std::expected send(Method method, const Request &req) { auto maybe_socketfd = connect(req.domain_name, req.port); if (!maybe_socketfd.has_value()) { @@ -93,7 +93,7 @@ namespace http { return Response::build(maybe_response.value()); } - std::string build_request(Method method, const RequestOpts &req) { + std::string build_request(Method method, const Request &req) { std::stringstream ss; ss << method << " " << req.query << " HTTP/" << (int)req.version.major << "." << (int)req.version.minor << NEW_LINE; @@ -127,7 +127,7 @@ namespace http { } namespace async { - std::future> send(Method method, const RequestOpts &req) { + std::future> send(Method method, const Request &req) { return std::async(::http::send, method, req); } } // namespace async -- 2.52.0