SwitchGame/source/Tool/Tool_Network.cpp

87 lines
2.1 KiB
C++

#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;
}