diff --git a/src/network/Network.cpp b/src/network/Network.cpp index b91e51df..a2b98680 100644 --- a/src/network/Network.cpp +++ b/src/network/Network.cpp @@ -9,7 +9,9 @@ using namespace network; static debug::Logger logger("network"); -size_t write_callback(char* ptr, size_t size, size_t nmemb, void* userdata) { +static size_t write_callback( + char* ptr, size_t size, size_t nmemb, void* userdata +) { auto& buffer = *reinterpret_cast*>(userdata); size_t psize = buffer.size(); buffer.resize(psize + size * nmemb); @@ -30,7 +32,8 @@ public: curl_easy_cleanup(curl); } - void get(const std::string& url, const OnResponse& callback) override { + void get(const std::string& url, OnResponse onResponse, OnReject onReject) + override { std::vector buffer; curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); @@ -45,8 +48,16 @@ public: totalDownload += size; } totalDownload += buffer.size(); + if (onResponse) { + onResponse(std::move(buffer)); + } + } else { + auto message = curl_easy_strerror(res); + logger.error() << message << " (" << url << ")"; + if (onReject) { + onReject(message); + } } - callback(res, std::move(buffer)); } size_t getTotalUpload() const override { @@ -71,8 +82,10 @@ Network::Network(std::unique_ptr http) : http(std::move(http)) { Network::~Network() = default; -void Network::httpGet(const std::string& url, const OnResponse& callback) { - http->get(url, callback); +void Network::httpGet( + const std::string& url, OnResponse onResponse, OnReject onReject +) { + http->get(url, onResponse, onReject); } size_t Network::getTotalUpload() const { diff --git a/src/network/Network.hpp b/src/network/Network.hpp index c3a131da..fbf77926 100644 --- a/src/network/Network.hpp +++ b/src/network/Network.hpp @@ -9,13 +9,18 @@ #include "util/Buffer.hpp" namespace network { - using OnResponse = std::function)>; + using OnResponse = std::function)>; + using OnReject = std::function; class Http { public: virtual ~Http() {} - virtual void get(const std::string& url, const OnResponse& callback) = 0; + virtual void get( + const std::string& url, + OnResponse onResponse, + OnReject onReject=nullptr + ) = 0; virtual size_t getTotalUpload() const = 0; virtual size_t getTotalDownload() const = 0; }; @@ -26,7 +31,11 @@ namespace network { Network(std::unique_ptr http); ~Network(); - void httpGet(const std::string& url, const OnResponse& callback); + void httpGet( + const std::string& url, + OnResponse onResponse, + OnReject onReject = nullptr + ); size_t getTotalUpload() const; size_t getTotalDownload() const; diff --git a/test/network/curltest.cpp b/test/network/curltest.cpp index ade22242..ac4d04dd 100644 --- a/test/network/curltest.cpp +++ b/test/network/curltest.cpp @@ -9,9 +9,12 @@ TEST(curltest, curltest) { network->httpGet( "https://raw.githubusercontent.com/MihailRis/VoxelEngine-Cpp/refs/" "heads/curl/res/content/base/blocks/lamp.json", - [=](int code, std::vector data) { - auto v = std::string_view(data.data(), data.size()); - auto value = json::parse(v); + [](std::vector data) { + if (data.empty()) { + return; + } + auto view = std::string_view(data.data(), data.size()); + auto value = json::parse(view); std::cout << value << std::endl; } );