Change router input logic and more

This commit is contained in:
Pablu23
2024-11-12 14:25:08 +01:00
parent 0a289b99b5
commit 601e0269c1
5 changed files with 52 additions and 29 deletions

View File

@@ -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<std::byte>());
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();

View File

@@ -10,11 +10,16 @@ using namespace http;
Response::Response(statuscode::statusCode statusCode) {
m_statusCode = statusCode;
SetHeader("Connection", "close");
}
void Response::SetPayload(std::vector<std::byte> 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<std::byte> data) {
m_headers.insert(std::pair<std::string, std::string>(
"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<std::string, std::string>(
"content-length", std::to_string(std::strlen(data.data()))));
"Content-Length", std::to_string(std::strlen(data.data()))));
m_payload = std::vector<std::byte>(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) {

View File

@@ -17,8 +17,9 @@ public:
Response(statuscode::statusCode statusCode);
// Response(std::vector<std::byte> data);
// Response(std::string data);
void SetPayload(std::vector<std::byte> data);
void SetPayload(std::string data);
void SetHeader(const std::string name, const std::string value);
void SetPayload(const std::vector<std::byte> data);
void SetPayload(const std::string data);
void SetContentType(const std::string type);
void SetStatusCode(const statuscode::statusCode statuscode);
void Send(int clientSocket);

View File

@@ -2,8 +2,12 @@
#include "http.hpp"
#include <csignal>
#include <cstdint>
#include <iostream>
#include <mutex>
#include <strings.h>
#include <sys/select.h>
#include <sys/socket.h>
#include <unistd.h>
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<Response(Request, Response)> func) {
std::function<void(Request, Response *)> 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;
}
}

View File

@@ -14,7 +14,7 @@
namespace http {
class Router {
private:
std::map<std::string, std::function<Response(Request, Response)>> m_routes;
std::map<std::string, std::function<void(Request, Response *)>> 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<Response(Request, Response)> func);
std::function<void(Request, Response *)> func);
int Start();
int Stop();
};