diff options
| author | Aotrix <[email protected]> | 2026-01-31 00:37:35 +0100 |
|---|---|---|
| committer | Aotrix <[email protected]> | 2026-01-31 00:37:35 +0100 |
| commit | ae0aeff7ac5e3bda80547babdba9a26533d428d9 (patch) | |
| tree | 2b4d79fd8653ff6bcd81d76c1021a646e8b83c5e /battleNetApi/src | |
| parent | 40d7391fcbc057823d423ddd0f0c6d532d7cf4eb (diff) | |
added parallelization for cards retrieval
Diffstat (limited to 'battleNetApi/src')
| -rw-r--r-- | battleNetApi/src/hearthstoneApi.cpp | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/battleNetApi/src/hearthstoneApi.cpp b/battleNetApi/src/hearthstoneApi.cpp index 945425f..1d2d870 100644 --- a/battleNetApi/src/hearthstoneApi.cpp +++ b/battleNetApi/src/hearthstoneApi.cpp @@ -1,6 +1,9 @@ #include "hearthstoneApi.hpp" #include <curl/curl.h> +#include <curl/easy.h> +#include <curl/multi.h> #include <format> +#include <iostream> HearthstoneApi::HearthstoneApi(Token &&iToken) : mToken(iToken), mAuthorizationHeader(authorizationHeader()) {} HearthstoneApi::HearthstoneApi(const Token &iToken) : mToken(iToken), mAuthorizationHeader(authorizationHeader()) {} @@ -36,3 +39,61 @@ json HearthstoneApi::makeApiRequest(const std::string &iUrl) const { json aOutputJson = json::parse(aRequestOutput); return aOutputJson; } + +std::vector<json> HearthstoneApi::makeApiRequest(const std::vector<std::string> &iUrls) const { + std::vector<std::string> aResponses(iUrls.size()); + CURLM *curlm = curl_multi_init(); + if (curlm) { + for (std::vector<std::string>::size_type i{0}; i < aResponses.size(); ++i) { + CURL *curl = curl_easy_init(); + curl_easy_setopt(curl, CURLOPT_URL, iUrls[i].c_str()); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curlCallbackStringOutput); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &(aResponses[i])); + struct curl_slist *chunk = nullptr; + chunk = curl_slist_append(chunk, mAuthorizationHeader.c_str()); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk); + curl_multi_add_handle(curlm, curl); + } + const int kMaxWaitMs{5000}; + int aStillRunning{0}; + curl_multi_perform(curlm, &aStillRunning); + do { + int numfds = 0; + int res = curl_multi_wait(curlm, NULL, 0, kMaxWaitMs, &numfds); + if (res != CURLM_OK) { + std::cerr << std::format("error: curl_multi_wait() returned {}\n", res); + } + curl_multi_perform(curlm, &aStillRunning); + } while (aStillRunning); + + // clean-up + CURLMsg *aMessage{nullptr}; + CURL *aHandle{nullptr}; + int aMessagesLeft{0}; + CURLcode aReturnCode; + while ((aMessage = curl_multi_info_read(curlm, &aMessagesLeft))) { + if (aMessage->msg == CURLMSG_DONE) { + aHandle = aMessage->easy_handle; + aReturnCode = aMessage->data.result; + if (aReturnCode != CURLE_OK) { + fprintf(stderr, "CURL error code: %d\n", aMessage->data.result); + continue; + } + curl_multi_remove_handle(curlm, aHandle); + curl_easy_cleanup(aHandle); + aHandle = nullptr; + } else { + std::cerr << std::format("error: after curl_multi_info_read(), CURLMsg={}\n", + static_cast<int>(aMessage->msg)); + } + } + curl_multi_cleanup(curlm); + } + std::vector<json> aJsonOutputs; + for (std::string aResponse : aResponses) { + aJsonOutputs.push_back(json::parse(aResponse)); + } + return aJsonOutputs; +} |
