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 ++++++++++++++++++++++++----------------------- src/uaLookup.hpp | 20 +++++++++++++++++++- 2 files changed, 43 insertions(+), 24 deletions(-) (limited to 'src') 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; } } diff --git a/src/uaLookup.hpp b/src/uaLookup.hpp index 5492f05..843283e 100644 --- a/src/uaLookup.hpp +++ b/src/uaLookup.hpp @@ -1,6 +1,8 @@ #pragma once +#include "util.hpp" #include +#include #include #include @@ -12,5 +14,21 @@ namespace WebStat { CURLcode code; }; - std::string getUserAgentDetail(std::string_view uas, const char * baseUrl = "https://useragentstring.com"); + using CurlPtr = std::unique_ptr>; + using CurlMimePtr = std::unique_ptr>; + using CurlErrorBuf = std::array; + + class CurlOperation { + public: + CurlOperation(); + void addForm(const char * name, std::string_view data); + + CurlPtr hnd; + CurlMimePtr mime; + CurlErrorBuf err; + std::string result; + }; + + std::unique_ptr curlGetUserAgentDetail( + std::string_view uas, const char * baseUrl = "https://useragentstring.com"); } -- cgit v1.2.3