]> git.leonardobizzoni.com Git - http-lib/commitdiff
Return error if invalid response instead of defaulting
authorLeonardoBizzoni <leo2002714@gmail.com>
Tue, 13 Aug 2024 12:44:43 +0000 (14:44 +0200)
committerLeonardoBizzoni <leo2002714@gmail.com>
Tue, 13 Aug 2024 12:44:43 +0000 (14:44 +0200)
src/error.h
src/main.cpp
src/response.cpp
src/response.h

index 64c4009d36c056608cca14eea8d105b040b9f5bf..1c2f2d51c97c81ecf27ded3692308e69823e0995 100644 (file)
@@ -7,5 +7,8 @@ namespace http {
     DNSResolution,
     ServerNotFound,
     InvalidRead,
+    InvalidResponse,
+    InvalidResponseHTTPVersion,
+    InvalidResponseStatusCode,
   };
 }
index 42294ce8468596580a1167a222ca2dd15fedc9d0..66a11bc681a17195a5c562284bdafb3e62f625e5 100644 (file)
@@ -1,13 +1,10 @@
-#include <unistd.h>
-
 #include <iostream>
 
 #include "http.h"
-#include "request.h"
 
 int main() {
-  auto resp1 = http::async::send(http::Method::GET,
-                                http::RequestOpts{.domain_name = "google.com", .query = "/prova"});
+  auto resp1 = http::async::send(http::Method::GET, {.domain_name = "example.com",
+                                                    .version = {1, 1}});
 
   auto resp = resp1.get();
   if (!resp.has_value()) {
@@ -27,6 +24,15 @@ int main() {
       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;
index cdc9d779b840519c5f5772eed3b723f146b3e2da..cc81be1c3cdb0d64c7ecbaf5a811d3d4c14896d9 100644 (file)
@@ -1,11 +1,16 @@
 #include <iostream>
 #include <ranges>
 #include <string_view>
+#include <utility>
 
 #include "http.h"
 
 namespace http {
   std::expected<Response, Error> Response::build(std::string_view raw_response) noexcept {
+    if (raw_response.empty()) {
+      return ERR(Error::InvalidResponse);
+    }
+
     Response resp;
 
     auto lines_view = raw_response | std::views::split(NEW_LINE);
@@ -22,14 +27,14 @@ namespace http {
       resp.version = {.major = (uint8_t)std::stoi(major.data()),
                      .minor = (uint8_t)std::stoi(minor.data())};
     } catch (...) {
-      resp.version = {.major = 0, .minor = 0};
+      return ERR(Error::InvalidResponseHTTPVersion);
     }
 
     try {
       std::string_view status(*++word_iter);
       resp.status = status_map[std::stoi(status.data())];
     } catch (...) {
-      resp.status = Status::PARSE_ERROR;
+      return ERR(Error::InvalidResponseStatusCode);
     }
 
     for (std::string_view line; lines_view_iter != lines_view.end() &&
@@ -55,8 +60,6 @@ std::ostream &operator<<(std::ostream &os, const http::Status &status) {
   using namespace http;
 
   switch (status) {
-    case Status::PARSE_ERROR:
-      return os << (uint16_t)status << " - Parse Error";
     case Status::CONTINUE:
       return os << (uint16_t)status << " - Continue";
     case Status::SWITCHING_PROTOCOLS:
@@ -181,9 +184,8 @@ std::ostream &operator<<(std::ostream &os, const http::Status &status) {
       return os << (uint16_t)status << " - Not Extended";
     case Status::NETWORK_AUTHENTICATION_REQUIRED:
       return os << (uint16_t)status << " - Network Authentication Required";
-
     default:
-      return os << (uint16_t)status << " - Unknown Status";
+      std::unreachable();
   }
 }
 
index 79798343edb2e512335d86fdb873476b811352d7..2c54b62cd47aca063d0adbc33405f7954212a989 100644 (file)
@@ -11,7 +11,6 @@
 
 namespace http {
   enum class Status {
-    PARSE_ERROR = 0,
     CONTINUE = 100,
     SWITCHING_PROTOCOLS = 101,
     PROCESSING = 102,