]> git.leonardobizzoni.com Git - http-lib/commitdiff
Started working on listening for HTTP trafic
authorLeonardoBizzoni <leo2002714@gmail.com>
Tue, 13 Aug 2024 16:34:44 +0000 (18:34 +0200)
committerLeonardoBizzoni <leo2002714@gmail.com>
Tue, 13 Aug 2024 16:34:44 +0000 (18:34 +0200)
src/http.h
src/listener.cpp [new file with mode: 0644]
src/listener.h [new file with mode: 0644]
src/main.cpp
src/request.cpp [new file with mode: 0644]
src/request.h
src/send.cpp

index f54a97ab196ba894451100e3e926007dbc237cc2..c3bf9ae3aa0243f37b542e4183700f04c1b4dd0d 100644 (file)
@@ -1,23 +1,25 @@
 #pragma once
 
 #include <future>
+
 #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<Response, Error> send(Method, const RequestOpts& req);
+  std::expected<Response, Error> send(Method, const Request& req);
 
   std::expected<int8_t, Error> 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<std::string, Error> read_raw_response(const int8_t socketfd);
 
   namespace async {
-    std::future<std::expected<Response, Error>> send(Method method, const RequestOpts &req);
+    std::future<std::expected<Response, Error>> send(Method method, const Request &req);
   }
 }  // namespace http
diff --git a/src/listener.cpp b/src/listener.cpp
new file mode 100644 (file)
index 0000000..7bdb656
--- /dev/null
@@ -0,0 +1,16 @@
+#include "listener.h"
+
+namespace http {
+  std::expected<Listener, Error> 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 (file)
index 0000000..489d5a6
--- /dev/null
@@ -0,0 +1,29 @@
+#pragma once
+
+#include <cstdint>
+#include <expected>
+#include <functional>
+#include <string>
+#include <unordered_map>
+
+#include "error.h"
+#include "request.h"
+
+namespace http {
+  struct Listener {
+  public:
+    ~Listener() {}
+
+    static std::expected<Listener, Error> create_on_local(uint16_t port);
+    static std::expected<Listener, Error> create_on_lan(uint16_t port);
+
+    void serve();
+    void serve_async();
+
+  private:
+    Listener() : routes({}) {}
+
+  public:
+    std::unordered_map<std::string, std::function<void(const Request &)>> routes;
+  };
+}  // namespace http
index 66a11bc681a17195a5c562284bdafb3e62f625e5..5fdd54fb2b6231de47bb407e6fb93f628ed62fdd 100644 (file)
@@ -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 (file)
index 0000000..5908c2b
--- /dev/null
@@ -0,0 +1,10 @@
+#include "request.h"
+
+#include <iomanip>
+
+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)
+           << " }";
+}
index e6c168f0d78e56108e68039b6d8444164e57bad7..262261bc4977f6fb31cc2c4839a5431fba240bc2 100644 (file)
@@ -2,6 +2,7 @@
 
 #include <cstdint>
 #include <string_view>
+#include <ostream>
 
 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);
index 557158e98de2a96c9e2dc1bfc41774b5ddd050ef..4be2fd1748128e2f3f6ba0d5a213ec71fbe5305c 100644 (file)
@@ -74,7 +74,7 @@ namespace http {
     return remote_socketfd;
   }
 
-  std::expected<Response, Error> send(Method method, const RequestOpts &req) {
+  std::expected<Response, Error> 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<std::expected<Response, Error>> send(Method method, const RequestOpts &req) {
+    std::future<std::expected<Response, Error>> send(Method method, const Request &req) {
       return std::async(::http::send, method, req);
     }
   }  // namespace async