summaryrefslogtreecommitdiff
path: root/battleNetApi/src
diff options
context:
space:
mode:
authorAotrix <[email protected]>2026-01-31 00:37:35 +0100
committerAotrix <[email protected]>2026-01-31 00:37:35 +0100
commitae0aeff7ac5e3bda80547babdba9a26533d428d9 (patch)
tree2b4d79fd8653ff6bcd81d76c1021a646e8b83c5e /battleNetApi/src
parent40d7391fcbc057823d423ddd0f0c6d532d7cf4eb (diff)
added parallelization for cards retrieval
Diffstat (limited to 'battleNetApi/src')
-rw-r--r--battleNetApi/src/hearthstoneApi.cpp61
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;
+}