From f44d3355f90b94703a8c0ae6d4c05d756ab1fedb Mon Sep 17 00:00:00 2001 From: MihailRis Date: Thu, 10 Sep 2026 22:45:18 +0300 Subject: [PATCH] fix curl handles lifetime --- src/network/Curl.cpp | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/network/Curl.cpp b/src/network/Curl.cpp index 52c2e4132..42d4817c8 100644 --- a/src/network/Curl.cpp +++ b/src/network/Curl.cpp @@ -24,9 +24,19 @@ static size_t write_callback( } struct ProcessingRequest { + CURLM* multiHandle; CURL* curl; HttpRequest request; std::vector buffer; + + ProcessingRequest(CURLM* multiHandle) : multiHandle(multiHandle) { + curl = curl_easy_init(); + } + + ~ProcessingRequest() { + curl_multi_remove_handle(multiHandle, curl); + curl_easy_cleanup(curl); + } }; class CurlRequests : public Requests { @@ -40,10 +50,7 @@ public: } virtual ~CurlRequests() { - for (auto& entry : requests) { - curl_multi_remove_handle(multiHandle, entry->curl); - curl_easy_cleanup(entry->curl); - } + requests.clear(); curl_multi_cleanup(multiHandle); } @@ -52,10 +59,8 @@ public: } void processRequest(HttpRequest request) { - auto curl = curl_easy_init(); - - auto entry = std::make_unique(); - entry->curl = curl; + auto entry = std::make_unique(multiHandle); + auto curl = entry->curl; curl_easy_setopt(curl, CURLOPT_URL, request.url.c_str()); curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, request.method.c_str()); @@ -123,9 +128,11 @@ public: logger.error() << "could not find request for cURL handle"; return; } - auto& entry = *found; + auto entry = std::move(*found); auto& req = entry->request; + requests.erase(found); + if(msg->msg == CURLMSG_DONE) { curl_multi_remove_handle(multiHandle, curl); }