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");
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);
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<char> 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) : 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 {

View File

@ -9,13 +9,18 @@
#include "util/Buffer.hpp"
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 {
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> 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;

View File

@ -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<char> data) {
auto v = std::string_view(data.data(), data.size());
auto value = json::parse(v);
[](std::vector<char> data) {
if (data.empty()) {
return;
}
auto view = std::string_view(data.data(), data.size());
auto value = json::parse(view);
std::cout << value << std::endl;
}
);