From 601e0269c1f33571a944323c7ec045f3ba65f16c Mon Sep 17 00:00:00 2001 From: Pablu23 Date: Tue, 12 Nov 2024 14:25:08 +0100 Subject: [PATCH] Change router input logic and more --- main.cpp | 41 +++++++++++++++++++++++------------------ response.cpp | 15 ++++++++++----- response.hpp | 5 +++-- router.cpp | 16 ++++++++++++++-- router.hpp | 4 ++-- 5 files changed, 52 insertions(+), 29 deletions(-) diff --git a/main.cpp b/main.cpp index 561831e..71ec67c 100644 --- a/main.cpp +++ b/main.cpp @@ -1,37 +1,42 @@ +#include "http.hpp" #include "router.hpp" using namespace http; -int main() { +void HelloWorld(Request req, Response *res) { + res->SetPayload("Hello World!"); + res->SetContentType("text/plain"); +} + +int main() { + Router router(8181); - http::Router router(8080); // Allow all Methods - router.Handle("/helloWorld", [](Request req, Response res) -> Response { - res.SetPayload("Hello World!"); - res.SetContentType("text/plain"); - return res; + router.Handle("/helloWorld", HelloWorld); + + router.Handle("/healthz", [](Request req, Response *res) { + res->SetStatusCode(statuscode::OK); + res->SetPayload(std::vector()); + res->SetContentType("text/plain"); }); // Only allow GET - router.Handle("GET /echo/{name}", [](Request req, Response res) -> Response { + router.Handle("GET /echo/{name}", [](Request req, Response *res) { std::string name = req.path.Get("name").value_or("No Name given"); - res.SetPayload("Hello " + name); - res.SetContentType("text/plain"); - return res; + res->SetPayload("Hello " + name); + res->SetContentType("text/plain"); }); // Only allow POST - router.Handle("POST /echo/{name}", [](Request req, Response res) -> Response { + router.Handle("POST /echo/{name}", [](Request req, Response *res) { std::string name = req.path.Get("name").value_or("No Name given"); - res.SetPayload("Hello with Post" + name); - res.SetContentType("text/plain"); - return res; + res->SetPayload("Hello with Post" + name); + res->SetContentType("text/plain"); }); - router.Handle("/", [](Request req, Response res) -> Response { - res.SetPayload("Main"); - res.SetContentType("text/plain"); - return res; + router.Handle("/", [](Request req, Response *res) { + res->SetPayload("Main"); + res->SetContentType("text/plain"); }); router.Start(); diff --git a/response.cpp b/response.cpp index 42faeb4..2afa82d 100644 --- a/response.cpp +++ b/response.cpp @@ -10,11 +10,16 @@ using namespace http; Response::Response(statuscode::statusCode statusCode) { m_statusCode = statusCode; + SetHeader("Connection", "close"); } -void Response::SetPayload(std::vector data) { +void Response::SetHeader(const std::string name, const std::string value) { + m_headers.insert_or_assign(name, value); +} + +void Response::SetPayload(const std::vector data) { m_headers.insert(std::pair( - "content-length", std::to_string(data.size()))); + "Content-Length", std::to_string(data.size()))); m_payload = data; } @@ -22,9 +27,9 @@ void Response::SetStatusCode(statuscode::statusCode statuscode) { m_statusCode = statuscode; } -void Response::SetPayload(std::string data) { +void Response::SetPayload(const std::string data) { m_headers.insert(std::pair( - "content-length", std::to_string(std::strlen(data.data())))); + "Content-Length", std::to_string(std::strlen(data.data())))); m_payload = std::vector(data.size() + 1); std::transform(data.begin(), data.end(), m_payload.begin(), @@ -32,7 +37,7 @@ void Response::SetPayload(std::string data) { } void Response::SetContentType(const std::string type) { - m_headers.insert_or_assign("content-type", type); + m_headers.insert_or_assign("Content-Type", type); } void Response::Send(int clientSocket) { diff --git a/response.hpp b/response.hpp index 402bbea..070645f 100644 --- a/response.hpp +++ b/response.hpp @@ -17,8 +17,9 @@ public: Response(statuscode::statusCode statusCode); // Response(std::vector data); // Response(std::string data); - void SetPayload(std::vector data); - void SetPayload(std::string data); + void SetHeader(const std::string name, const std::string value); + void SetPayload(const std::vector data); + void SetPayload(const std::string data); void SetContentType(const std::string type); void SetStatusCode(const statuscode::statusCode statuscode); void Send(int clientSocket); diff --git a/router.cpp b/router.cpp index 586bcde..d3b8661 100644 --- a/router.cpp +++ b/router.cpp @@ -2,8 +2,12 @@ #include "http.hpp" #include #include +#include #include #include +#include +#include +#include using namespace http; @@ -78,17 +82,23 @@ void Router::ThreadLoop() { Request req(buffer); Response res = Route(req); res.Send(client); + + shutdown(client, SHUT_WR); + while (recv(client, buffer.data(), buffer.size(), 0) > 0) { + std::cout << buffer.data() << std::endl; + } close(client); } } void Router::Handle(std::string pathPattern, - std::function func) { + std::function func) { m_routes.insert_or_assign(pathPattern, func); } // This should be better // Probably dont use map but a tree for it, then traverse tree for routing +// Also this isnt accurate Response Router::Route(Request req) { for (const auto &[key, value] : m_routes) { std::string pattern = key; @@ -121,10 +131,12 @@ Response Router::Route(Request req) { pattern.erase(0, pos + 1); path.erase(0, uPos + 1); } + if (found) { Response res(statuscode::OK); req.path.Match(patternCopy); - return value(req, res); + value(req, &res); + return res; } } diff --git a/router.hpp b/router.hpp index 870ec07..bc31ed5 100644 --- a/router.hpp +++ b/router.hpp @@ -14,7 +14,7 @@ namespace http { class Router { private: - std::map> m_routes; + std::map> m_routes; int m_socket; sockaddr_in m_address; Response Route(Request req); @@ -33,7 +33,7 @@ private: public: Router(int port); void Handle(std::string pathPattern, - std::function func); + std::function func); int Start(); int Stop(); };