add httpGet error handling

This commit is contained in:
MihailRis 2024-11-11 14:47:09 +03:00
parent d7389c2220
commit 4328c83c79
3 changed files with 36 additions and 11 deletions

View File

@ -9,7 +9,9 @@ using namespace network;
static debug::Logger logger("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<std::vector<char>*>(userdata); auto& buffer = *reinterpret_cast<std::vector<char>*>(userdata);
size_t psize = buffer.size(); size_t psize = buffer.size();
buffer.resize(psize + size * nmemb); buffer.resize(psize + size * nmemb);
@ -30,7 +32,8 @@ public:
curl_easy_cleanup(curl); 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<char> buffer; std::vector<char> buffer;
curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
@ -45,8 +48,16 @@ public:
totalDownload += size; totalDownload += size;
} }
totalDownload += buffer.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 { size_t getTotalUpload() const override {
@ -71,8 +82,10 @@ Network::Network(std::unique_ptr<Http> http) : http(std::move(http)) {
Network::~Network() = default; Network::~Network() = default;
void Network::httpGet(const std::string& url, const OnResponse& callback) { void Network::httpGet(
http->get(url, callback); const std::string& url, OnResponse onResponse, OnReject onReject
) {
http->get(url, onResponse, onReject);
} }
size_t Network::getTotalUpload() const { size_t Network::getTotalUpload() const {

View File

@ -9,13 +9,18 @@
#include "util/Buffer.hpp" #include "util/Buffer.hpp"
namespace network { namespace network {
using OnResponse = std::function<void(int, std::vector<char>)>; using OnResponse = std::function<void(std::vector<char>)>;
using OnReject = std::function<void(const char*)>;
class Http { class Http {
public: public:
virtual ~Http() {} 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 getTotalUpload() const = 0;
virtual size_t getTotalDownload() const = 0; virtual size_t getTotalDownload() const = 0;
}; };
@ -26,7 +31,11 @@ namespace network {
Network(std::unique_ptr<Http> http); Network(std::unique_ptr<Http> http);
~Network(); ~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 getTotalUpload() const;
size_t getTotalDownload() const; size_t getTotalDownload() const;

View File

@ -9,9 +9,12 @@ TEST(curltest, curltest) {
network->httpGet( network->httpGet(
"https://raw.githubusercontent.com/MihailRis/VoxelEngine-Cpp/refs/" "https://raw.githubusercontent.com/MihailRis/VoxelEngine-Cpp/refs/"
"heads/curl/res/content/base/blocks/lamp.json", "heads/curl/res/content/base/blocks/lamp.json",
[=](int code, std::vector<char> data) { [](std::vector<char> data) {
auto v = std::string_view(data.data(), data.size()); if (data.empty()) {
auto value = json::parse(v); return;
}
auto view = std::string_view(data.data(), data.size());
auto value = json::parse(view);
std::cout << value << std::endl; std::cout << value << std::endl;
} }
); );