fix curl handles lifetime

This commit is contained in:
MihailRis 2026-09-10 22:45:18 +03:00
parent 9510e06a26
commit f44d3355f9

View file

@ -24,9 +24,19 @@ static size_t write_callback(
} }
struct ProcessingRequest { struct ProcessingRequest {
CURLM* multiHandle;
CURL* curl; CURL* curl;
HttpRequest request; HttpRequest request;
std::vector<char> buffer; std::vector<char> 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 { class CurlRequests : public Requests {
@ -40,10 +50,7 @@ public:
} }
virtual ~CurlRequests() { virtual ~CurlRequests() {
for (auto& entry : requests) { requests.clear();
curl_multi_remove_handle(multiHandle, entry->curl);
curl_easy_cleanup(entry->curl);
}
curl_multi_cleanup(multiHandle); curl_multi_cleanup(multiHandle);
} }
@ -52,10 +59,8 @@ public:
} }
void processRequest(HttpRequest request) { void processRequest(HttpRequest request) {
auto curl = curl_easy_init(); auto entry = std::make_unique<ProcessingRequest>(multiHandle);
auto curl = entry->curl;
auto entry = std::make_unique<ProcessingRequest>();
entry->curl = curl;
curl_easy_setopt(curl, CURLOPT_URL, request.url.c_str()); curl_easy_setopt(curl, CURLOPT_URL, request.url.c_str());
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, request.method.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"; logger.error() << "could not find request for cURL handle";
return; return;
} }
auto& entry = *found; auto entry = std::move(*found);
auto& req = entry->request; auto& req = entry->request;
requests.erase(found);
if(msg->msg == CURLMSG_DONE) { if(msg->msg == CURLMSG_DONE) {
curl_multi_remove_handle(multiHandle, curl); curl_multi_remove_handle(multiHandle, curl);
} }