#include "Tool/Tool_Network.h" // 定义内存管理结构体 struct MemoryStruct { char *memory; size_t size; }; size_t write_callback(void *contents, size_t size, size_t nmemb, void *userp) { size_t realsize = size * nmemb; struct MemoryStruct *mem = (struct MemoryStruct *)userp; void *ptr = realloc(mem->memory, mem->size + realsize + 1); if (!ptr) { RemoteLogger::GetInstance().log("内存分配失败 (out of memory)"); return 0; } mem->memory = (char *)ptr; memcpy(&(mem->memory[mem->size]), contents, realsize); mem->size += realsize; mem->memory[mem->size] = '\0'; return realsize; } int http_get(const char *url, char **response, size_t *response_size) { CURL *curl; CURLcode res; struct MemoryStruct chunk; // 初始化内存结构 chunk.memory = (char *)malloc(1); chunk.size = 0; if (!chunk.memory) { RemoteLogger::GetInstance().log("初始内存分配失败"); return -1; } curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); // 允许重定向 curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 5L); // 执行请求 res = curl_easy_perform(curl); // 检查HTTP状态码 long response_code; curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code); // RemoteLogger::GetInstance().log("HTTP 状态码: %ld"); if (res != CURLE_OK) { RemoteLogger::GetInstance().log("请求失败: %s", curl_easy_strerror(res)); free(chunk.memory); *response = NULL; *response_size = 0; curl_easy_cleanup(curl); return -1; } // 返回结果 *response = chunk.memory; *response_size = chunk.size; curl_easy_cleanup(curl); return 0; } free(chunk.memory); *response = NULL; *response_size = 0; return -1; }