add httpGet error handling
This commit is contained in:
parent
d7389c2220
commit
4328c83c79
@ -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 {
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user