87 lines
2.1 KiB
C++
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;
|
|
}
|