From 0682125e734fc8df07d7e8447da1bcecb570820a Mon Sep 17 00:00:00 2001 From: Dominik Durner Date: Wed, 6 Mar 2024 16:48:43 +0100 Subject: [PATCH] Added better error reporting --- include/network/http_response.hpp | 4 ++-- include/network/message_result.hpp | 11 ++++++----- src/network/http_message.cpp | 5 ++--- src/network/https_message.cpp | 5 ++--- src/network/message_result.cpp | 28 +++++++++++++++++++--------- 5 files changed, 31 insertions(+), 22 deletions(-) diff --git a/include/network/http_response.hpp b/include/network/http_response.hpp index 29dbc91..eb0bb8a 100644 --- a/include/network/http_response.hpp +++ b/include/network/http_response.hpp @@ -54,7 +54,7 @@ struct HttpResponse { Type type; /// Get the request method - static constexpr auto getResponseCode(const Code& code) noexcept { + static constexpr std::string_view getResponseCode(const Code& code) noexcept { switch (code) { case Code::OK_200: return "200 OK"; case Code::CREATED_201: return "201 Created"; @@ -75,7 +75,7 @@ struct HttpResponse { } } /// Get the request type - static constexpr auto getResponseType(const Type& type) noexcept { + static constexpr std::string_view getResponseType(const Type& type) noexcept { switch (type) { case Type::HTTP_1_0: return "HTTP/1.0"; case Type::HTTP_1_1: return "HTTP/1.1"; diff --git a/include/network/message_result.hpp b/include/network/message_result.hpp index bb8ede3..dc7eb02 100644 --- a/include/network/message_result.hpp +++ b/include/network/message_result.hpp @@ -1,4 +1,5 @@ #pragma once +#include "network/http_helper.hpp" #include #include #include @@ -63,10 +64,8 @@ class MessageResult { protected: /// The data std::unique_ptr> dataVector; - /// The size of the result; the size of the message body - uint64_t size; - /// The offset of the result; the start after the message header - uint64_t offset; + /// The http response header info + std::unique_ptr response; /// The error response const MessageResult* originError; /// The failure code @@ -101,7 +100,9 @@ class MessageResult { /// Get the failure code [[nodiscard]] uint16_t getFailureCode() const; /// Get the error response (incl. header) - [[nodiscard]] std::string_view getError() const; + [[nodiscard]] std::string_view getErrorResponse() const; + /// Get the error response code + [[nodiscard]] std::string_view getResponseCode() const; /// Is the data owned by this object [[nodiscard]] bool owned() const; /// Was the request successful diff --git a/src/network/http_message.cpp b/src/network/http_message.cpp index 44ac65a..f75eb40 100644 --- a/src/network/http_message.cpp +++ b/src/network/http_message.cpp @@ -97,9 +97,8 @@ MessageState HTTPMessage::execute(IOUringSocket& socket) // check whether finished http if (HttpHelper::finished(receive.data(), static_cast(receiveBufferOffset), info)) { socket.disconnect(request->fd, originalMessage->hostname, originalMessage->port, &tcpSettings, static_cast(sendBufferOffset + receiveBufferOffset)); - originalMessage->result.size = info->length; - originalMessage->result.offset = info->headerLength; - if (HttpResponse::checkSuccess(info->response.code)) { + originalMessage->result.response = move(info); + if (HttpResponse::checkSuccess(originalMessage->result.response->response.code)) { state = MessageState::Finished; } else { originalMessage->result.failureCode |= static_cast(MessageFailureCode::HTTP); diff --git a/src/network/https_message.cpp b/src/network/https_message.cpp index 3ad527b..04e2f9c 100644 --- a/src/network/https_message.cpp +++ b/src/network/https_message.cpp @@ -103,9 +103,8 @@ MessageState HTTPSMessage::execute(IOUringSocket& socket) receiveBufferOffset += result; try { if (HttpHelper::finished(receive.data(), static_cast(receiveBufferOffset), info)) { - originalMessage->result.size = info->length; - originalMessage->result.offset = info->headerLength; - if (HttpResponse::checkSuccess(info->response.code)) { + originalMessage->result.response = move(info); + if (HttpResponse::checkSuccess(originalMessage->result.response->response.code)) { state = MessageState::TLSShutdown; } else { originalMessage->result.failureCode |= static_cast(MessageFailureCode::HTTP); diff --git a/src/network/message_result.cpp b/src/network/message_result.cpp index fab186c..7c84ca1 100644 --- a/src/network/message_result.cpp +++ b/src/network/message_result.cpp @@ -13,13 +13,13 @@ namespace network { //--------------------------------------------------------------------------- using namespace std; //--------------------------------------------------------------------------- -MessageResult::MessageResult() : size(), offset(), originError(nullptr), failureCode(), state(MessageState::Init) +MessageResult::MessageResult() : response(), originError(nullptr), failureCode(), state(MessageState::Init) // The default constructor { dataVector = make_unique>(); } //--------------------------------------------------------------------------- -MessageResult::MessageResult(uint8_t* data, uint64_t size) : size(), offset(), originError(nullptr), failureCode(), state(MessageState::Init) +MessageResult::MessageResult(uint8_t* data, uint64_t size) : response(), originError(nullptr), failureCode(), state(MessageState::Init) // The constructor with buffer input { if (data) @@ -28,7 +28,7 @@ MessageResult::MessageResult(uint8_t* data, uint64_t size) : size(), offset(), o dataVector = make_unique>(); } //--------------------------------------------------------------------------- -MessageResult::MessageResult(utils::DataVector* dataVector) : size(), offset(), originError(nullptr), failureCode(), state(MessageState::Init) +MessageResult::MessageResult(utils::DataVector* dataVector) : response(), originError(nullptr), failureCode(), state(MessageState::Init) // The constructor with buffer input { this->dataVector = unique_ptr>(dataVector); @@ -37,13 +37,13 @@ MessageResult::MessageResult(utils::DataVector* dataVector) : size(), o const string_view MessageResult::getResult() const /// Get the result { - return string_view(reinterpret_cast(dataVector->cdata()) + offset, size); + return string_view(reinterpret_cast(dataVector->cdata()) + response->headerLength, response->length); } //--------------------------------------------------------------------------- string_view MessageResult::getResult() /// Get the result { - return string_view(reinterpret_cast(dataVector->data()) + offset, size); + return string_view(reinterpret_cast(dataVector->data()) + response->headerLength, response->length); } //--------------------------------------------------------------------------- const uint8_t* MessageResult::getData() const @@ -67,13 +67,13 @@ unique_ptr MessageResult::moveData() uint64_t MessageResult::getSize() const // Get the size { - return size; + return response->length; } //--------------------------------------------------------------------------- uint64_t MessageResult::getOffset() const // Get the offset { - return offset; + return response->headerLength; } //--------------------------------------------------------------------------- MessageState MessageResult::getState() const @@ -91,11 +91,21 @@ uint16_t MessageResult::getFailureCode() const return failureCode; } //--------------------------------------------------------------------------- -std::string_view MessageResult::getError() const +std::string_view MessageResult::getResponseCode() const +// Get the failure code +{ + if (originError) + return originError->getResponseCode(); + else + return HttpResponse::getResponseCode(response->response.code); +} + +//--------------------------------------------------------------------------- +std::string_view MessageResult::getErrorResponse() const // Get the error header { if (originError) - return originError->getError(); + return originError->getErrorResponse(); else return string_view(reinterpret_cast(dataVector->data()), dataVector->size()); }