From 74bb695807ea0a0816ee8ad3da4addd56b26d2cf Mon Sep 17 00:00:00 2001 From: MihailRis Date: Wed, 9 Sep 2026 23:43:44 +0300 Subject: [PATCH] cleanup http requests (part 1) --- src/logic/scripting/lua/libs/libnetwork.cpp | 32 ++++---- src/network/Curl.cpp | 85 +++++---------------- src/network/Network.cpp | 23 +----- src/network/Network.hpp | 17 +---- src/network/commons.hpp | 33 ++++---- test/network/curltest.cpp | 26 ++++--- 6 files changed, 73 insertions(+), 143 deletions(-) diff --git a/src/logic/scripting/lua/libs/libnetwork.cpp b/src/logic/scripting/lua/libs/libnetwork.cpp index 55db6e550..1493eb0f0 100644 --- a/src/logic/scripting/lua/libs/libnetwork.cpp +++ b/src/logic/scripting/lua/libs/libnetwork.cpp @@ -3,6 +3,7 @@ #include "engine/Engine.hpp" #include "network/Network.hpp" #include "devtools/Project.hpp" +#include "util/stringutil.hpp" #include #include @@ -91,24 +92,26 @@ static int perform_get(lua::State* L, network::Network& network, bool binary) { int currentRequestId = request_id++; - network.get( - url, + network::HttpRequest request {}; + request.url = std::move(url); + request.onResponse = [currentRequestId, binary](std::vector bytes) { push_event(NetworkEvent( RESPONSE, ResponseEventDto { 200, binary, currentRequestId, std::move(bytes)} )); - }, + }; + request.onReject = [currentRequestId, binary](int code, std::vector bytes) { push_event(NetworkEvent( RESPONSE, ResponseEventDto { code, binary, currentRequestId, std::move(bytes)} )); - }, - std::move(headers) - ); + }; + request.headers = std::move(headers); + network.request(std::move(request)); return lua::pushinteger(L, currentRequestId); } @@ -134,25 +137,28 @@ static int l_post(lua::State* L, network::Network& network) { auto headers = read_headers(L, 3); int currentRequestId = request_id++; - network.post( - url, - string, + network::HttpRequest request {}; + request.url = std::move(url); + request.body = string; + request.headers = std::move(headers); + request.headers.emplace_back("Content-Type: application/json"); + request.onResponse = [currentRequestId](std::vector bytes) { push_event(NetworkEvent( RESPONSE, ResponseEventDto { 200, false, currentRequestId, std::move(bytes)} )); - }, + }; + request.onReject = [currentRequestId](int code, std::vector bytes) { push_event(NetworkEvent( RESPONSE, ResponseEventDto { code, false, currentRequestId, std::move(bytes)} )); - }, - std::move(headers) - ); + }; + network.request(std::move(request)); return lua::pushinteger(L, currentRequestId); } diff --git a/src/network/Curl.cpp b/src/network/Curl.cpp index 1caafde73..4aad9c612 100644 --- a/src/network/Curl.cpp +++ b/src/network/Curl.cpp @@ -23,21 +23,6 @@ static size_t write_callback( return size * nmemb; } -enum class RequestType { - GET, POST -}; - -struct Request { - RequestType type; - std::string url; - OnResponse onResponse; - OnReject onReject; - long maxSize; - bool followLocation = false; - std::string data; - std::vector headers; -}; - class CurlRequests : public Requests { CURLM* multiHandle; CURL* curl; @@ -50,7 +35,7 @@ class CurlRequests : public Requests { std::vector buffer; std::string url; - std::queue requests; + std::queue requests; public: CurlRequests(CURLM* multiHandle, CURL* curl) : multiHandle(multiHandle), curl(curl) { @@ -61,47 +46,12 @@ public: curl_easy_cleanup(curl); curl_multi_cleanup(multiHandle); } - void get( - const std::string& url, - OnResponse onResponse, - OnReject onReject, - std::vector headers, - long maxSize - ) override { - Request request { - RequestType::GET, - url, - onResponse, - onReject, - maxSize, - true, - "", - std::move(headers)}; + + void request(HttpRequest request) override { processRequest(std::move(request)); } - void post( - const std::string& url, - const std::string& data, - OnResponse onResponse, - OnReject onReject=nullptr, - std::vector headers = {}, - long maxSize=0 - ) override { - Request request { - RequestType::POST, - url, - onResponse, - onReject, - maxSize, - false, - "", - std::move(headers)}; - request.data = data; - processRequest(std::move(request)); - } - - void processRequest(Request request) { + void processRequest(HttpRequest request) { if (!url.empty()) { requests.push(request); return; @@ -113,7 +63,19 @@ public: buffer.clear(); curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); - curl_easy_setopt(curl, CURLOPT_POST, request.type == RequestType::POST); + switch (request.method) { + case HttpMethod::GET: + break; + case HttpMethod::POST: + curl_easy_setopt(curl, CURLOPT_POST, true); + break; + case HttpMethod::PUT: + curl_easy_setopt(curl, CURLOPT_UPLOAD, true); + break; + case HttpMethod::DELETE: + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE"); + break; + } curl_slist* hs = nullptr; @@ -121,16 +83,9 @@ public: hs = curl_slist_append(hs, header.c_str()); } - switch (request.type) { - case RequestType::GET: - break; - case RequestType::POST: - hs = curl_slist_append(hs, "Content-Type: application/json"); - curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, request.data.length()); - curl_easy_setopt(curl, CURLOPT_COPYPOSTFIELDS, request.data.c_str()); - break; - default: - throw std::runtime_error("not implemented"); + if (!request.body.empty()) { + curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, request.body.length()); + curl_easy_setopt(curl, CURLOPT_COPYPOSTFIELDS, request.body.data()); } curl_easy_setopt(curl, CURLOPT_HTTPHEADER, hs); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, request.followLocation); diff --git a/src/network/Network.cpp b/src/network/Network.cpp index a0e1eb606..7b526a29a 100644 --- a/src/network/Network.cpp +++ b/src/network/Network.cpp @@ -51,27 +51,8 @@ Network::Network(std::unique_ptr requests) Network::~Network() = default; -void Network::get( - const std::string& url, - OnResponse onResponse, - OnReject onReject, - std::vector headers, - long maxSize -) { - requests->get(url, onResponse, onReject, std::move(headers), maxSize); -} - -void Network::post( - const std::string& url, - const std::string& fieldsData, - OnResponse onResponse, - OnReject onReject, - std::vector headers, - long maxSize -) { - requests->post( - url, fieldsData, onResponse, onReject, std::move(headers), maxSize - ); +void Network::request(HttpRequest request) { + requests->request(std::move(request)); } Connection* Network::getConnection(u64id_t id, bool includePrivate) { diff --git a/src/network/Network.hpp b/src/network/Network.hpp index 6d5cd6d54..49f44af6c 100644 --- a/src/network/Network.hpp +++ b/src/network/Network.hpp @@ -68,22 +68,7 @@ namespace network { Network(std::unique_ptr requests); ~Network(); - void get( - const std::string& url, - OnResponse onResponse, - OnReject onReject = nullptr, - std::vector headers = {}, - long maxSize=0 - ); - - void post( - const std::string& url, - const std::string& fieldsData, - OnResponse onResponse, - OnReject onReject = nullptr, - std::vector headers = {}, - long maxSize=0 - ); + void request(HttpRequest request); [[nodiscard]] Connection* getConnection(u64id_t id, bool includePrivate); [[nodiscard]] Server* getServer(u64id_t id, bool includePrivate) const; diff --git a/src/network/commons.hpp b/src/network/commons.hpp index 8b834bb3e..893a88ebe 100644 --- a/src/network/commons.hpp +++ b/src/network/commons.hpp @@ -10,6 +10,10 @@ #include namespace network { + enum class HttpMethod { + GET, POST, PUT, DELETE, + }; + using OnResponse = std::function)>; using OnReject = std::function)>; using ConnectCallback = std::function; @@ -17,26 +21,23 @@ namespace network { using ServerDatagramCallback = std::function; using ClientDatagramCallback = std::function; + struct HttpRequest { + HttpMethod method; + std::string url; + std::string body; + std::vector headers; + + OnResponse onResponse; + OnReject onReject; + bool followLocation = false; + long maxSize = -1; + }; + class Requests { public: virtual ~Requests() {} - virtual void get( - const std::string& url, - OnResponse onResponse, - OnReject onReject=nullptr, - std::vector headers = {}, - long maxSize=0 - ) = 0; - - virtual void post( - const std::string& url, - const std::string& data, - OnResponse onResponse, - OnReject onReject=nullptr, - std::vector headers = {}, - long maxSize=0 - ) = 0; + virtual void request(HttpRequest request) = 0; [[nodiscard]] virtual size_t getTotalUpload() const = 0; [[nodiscard]] virtual size_t getTotalDownload() const = 0; diff --git a/test/network/curltest.cpp b/test/network/curltest.cpp index 42806c77c..44f87d17e 100644 --- a/test/network/curltest.cpp +++ b/test/network/curltest.cpp @@ -6,18 +6,20 @@ TEST(curltest, curltest) { NetworkSettings settings {}; auto network = network::Network::create(settings); - network->get( - "https://raw.githubusercontent.com/MihailRis/VoxelEngine-Cpp/refs/" - "heads/curl/res/content/base/blocks/lamp.json", - [](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; - }, [](auto, auto){} - ); + + network::HttpRequest request {}; + request.url = "https://raw.githubusercontent.com/MihailRis/VoxelEngine-Cpp/refs/" + "heads/curl/res/content/base/blocks/lamp.json"; + request.onResponse = [](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; + }; + network->request(std::move(request)); + std::cout << "upload: " << network->getTotalUpload() << " B" << std::endl; std::cout << "download: " << network->getTotalDownload() << " B" << std::endl; }