From dae750d7dfa576b516ff55d6d486114b665103dc Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Fri, 5 Sep 2025 00:14:24 +0100 Subject: Change getUserAgentDetail to return a packaged CURL object This will be usable with curl_multi_* instead of being a single synchronous request. --- src/uaLookup.cpp | 47 ++++++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 23 deletions(-) (limited to 'src/uaLookup.cpp') diff --git a/src/uaLookup.cpp b/src/uaLookup.cpp index d62c313..5b31065 100644 --- a/src/uaLookup.cpp +++ b/src/uaLookup.cpp @@ -1,5 +1,4 @@ #include "uaLookup.hpp" -#include "util.hpp" #include #include @@ -11,40 +10,42 @@ namespace WebStat { result->append(ptr, nmemb * size); return nmemb * size; } - - void - addForm(curl_mime * mime, const char * name, const std::string_view data) - { - auto part = curl_mime_addpart(mime); - curl_mime_data(part, data.data(), data.length()); - curl_mime_name(part, name); - }; } - std::string - getUserAgentDetail(const std::string_view uas, const char * baseUrl) + CurlOperation::CurlOperation() : hnd {curl_easy_init()}, err {} { - std::string result; - std::array err {}; - std::unique_ptr> hnd {curl_easy_init()}; - curl_easy_setopt(hnd.get(), CURLOPT_URL, baseUrl); curl_easy_setopt(hnd.get(), CURLOPT_NOPROGRESS, 1L); - curl_easy_setopt(hnd.get(), CURLOPT_USERAGENT, "WebStat/0; +https://git.randomdan.homeip.net/repo/webstat/"); curl_easy_setopt(hnd.get(), CURLOPT_MAXREDIRS, 50L); curl_easy_setopt(hnd.get(), CURLOPT_TCP_KEEPALIVE, 1L); curl_easy_setopt(hnd.get(), CURLOPT_FAILONERROR, 1L); curl_easy_setopt(hnd.get(), CURLOPT_ERRORBUFFER, err.data()); curl_easy_setopt(hnd.get(), CURLOPT_WRITEDATA, &result); curl_easy_setopt(hnd.get(), CURLOPT_WRITEFUNCTION, &stringAppend); - std::unique_ptr> mime {curl_mime_init(hnd.get())}; - addForm(mime.get(), "uas", uas); - addForm(mime.get(), "getJSON", "all"); - curl_easy_setopt(hnd.get(), CURLOPT_MIMEPOST, mime.get()); + } - if (CURLcode ret = curl_easy_perform(hnd.get()); ret != CURLE_OK) { - throw CurlError {ret, err.data()}; + void + CurlOperation::addForm(const char * name, const std::string_view data) + { + if (!mime) { + mime.reset(curl_mime_init(hnd.get())); + curl_easy_setopt(hnd.get(), CURLOPT_MIMEPOST, mime.get()); } + auto part = curl_mime_addpart(mime.get()); + curl_mime_data(part, data.data(), data.length()); + curl_mime_name(part, name); + } + + std::unique_ptr + curlGetUserAgentDetail(const std::string_view uas, const char * baseUrl) + { + auto request = std::make_unique(); + + curl_easy_setopt(request->hnd.get(), CURLOPT_URL, baseUrl); + curl_easy_setopt( + request->hnd.get(), CURLOPT_USERAGENT, "WebStat/0; +https://git.randomdan.homeip.net/repo/webstat/"); + request->addForm("uas", uas); + request->addForm("getJSON", "all"); - return result; + return request; } } -- cgit v1.2.3