From 0d65dcd24c8090dcc719be599cd3ef4dc2220e9b Mon Sep 17 00:00:00 2001 From: frosty Date: Thu, 12 Mar 2026 18:05:09 -0400 Subject: refactor: put HTTP and XML logic into reusable modules --- src/Utility/HttpClient.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 src/Utility/HttpClient.c (limited to 'src/Utility/HttpClient.c') diff --git a/src/Utility/HttpClient.c b/src/Utility/HttpClient.c new file mode 100644 index 0000000..150b228 --- /dev/null +++ b/src/Utility/HttpClient.c @@ -0,0 +1,81 @@ +#include "HttpClient.h" +#include "../Proxy/Proxy.h" +#include +#include + +static size_t write_callback(void *contents, size_t size, size_t nmemb, + void *userp) { + size_t realsize = size * nmemb; + HttpResponse *mem = (HttpResponse *)userp; + + if (mem->size + realsize + 1 > mem->capacity) { + size_t new_cap = mem->capacity == 0 ? 16384 : mem->capacity * 2; + while (new_cap < mem->size + realsize + 1) + new_cap *= 2; + + char *ptr = realloc(mem->memory, new_cap); + if (!ptr) { + return 0; + } + mem->memory = ptr; + mem->capacity = new_cap; + } + + memcpy(&(mem->memory[mem->size]), contents, realsize); + mem->size += realsize; + mem->memory[mem->size] = 0; + + return realsize; +} + +HttpResponse http_get(const char *url, const char *user_agent) { + HttpResponse resp = {.memory = NULL, .size = 0, .capacity = 0}; + + if (!url) { + return resp; + } + + resp.memory = malloc(16384); + if (!resp.memory) { + return resp; + } + resp.capacity = 16384; + + CURL *curl = curl_easy_init(); + if (!curl) { + free(resp.memory); + resp.memory = NULL; + return resp; + } + + curl_easy_setopt(curl, CURLOPT_URL, url); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &resp); + curl_easy_setopt(curl, CURLOPT_USERAGENT, + user_agent ? user_agent : "libcurl-agent/1.0"); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(curl, CURLOPT_TIMEOUT, 15L); + apply_proxy_settings(curl); + + CURLcode res = curl_easy_perform(curl); + curl_easy_cleanup(curl); + + if (res != CURLE_OK) { + free(resp.memory); + resp.memory = NULL; + resp.size = 0; + resp.capacity = 0; + } + + return resp; +} + +void http_response_free(HttpResponse *resp) { + if (!resp) { + return; + } + free(resp->memory); + resp->memory = NULL; + resp->size = 0; + resp->capacity = 0; +} -- cgit v1.2.3