2023-01-26 19:54:38 +01:00
|
|
|
//===========================================================================//
|
|
|
|
//
|
|
|
|
// Purpose: A set of utilities to perform requests
|
|
|
|
//
|
|
|
|
//===========================================================================//
|
2023-01-30 00:04:11 +01:00
|
|
|
#include "tier1/cvar.h"
|
2023-04-06 23:50:48 +02:00
|
|
|
#include "tier2/curlutils.h"
|
2023-01-26 19:54:38 +01:00
|
|
|
|
2023-07-28 14:47:20 +02:00
|
|
|
size_t CURLWriteStringCallback(char* data, const size_t size, const size_t nmemb, string* userp)
|
2023-01-26 19:54:38 +01:00
|
|
|
{
|
2023-07-28 14:47:20 +02:00
|
|
|
userp->append(data, size * nmemb);
|
2023-01-26 19:54:38 +01:00
|
|
|
return size * nmemb;
|
|
|
|
}
|
|
|
|
|
2023-07-28 14:47:20 +02:00
|
|
|
size_t CURLWriteFileCallback(void* data, const size_t size, const size_t nmemb, FILE* userp)
|
|
|
|
{
|
|
|
|
const size_t numBytesWritten = fwrite(data, size, nmemb, userp);
|
|
|
|
return numBytesWritten;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CURLInitCommonOptions(CURL* curl, const char* remote, const void* writeData,
|
|
|
|
const void* writeFunction, const int timeout, const bool verifyPeer, const bool debug)
|
|
|
|
{
|
|
|
|
curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout);
|
|
|
|
curl_easy_setopt(curl, CURLOPT_VERBOSE, debug);
|
|
|
|
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, verifyPeer);
|
|
|
|
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);
|
|
|
|
curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_ALL);
|
|
|
|
curl_easy_setopt(curl, CURLOPT_URL, remote);
|
|
|
|
curl_easy_setopt(curl, CURLOPT_WRITEDATA, writeData);
|
|
|
|
curl_easy_setopt(curl, CURLOPT_USERAGENT, "R5R HTTPS/1.0");
|
|
|
|
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeFunction);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool CURLDownloadFile(const char* remote, const char* savePath, const char* fileName,
|
|
|
|
const char* options, curl_off_t dataSize, void* customPointer, CURLParams& params)
|
|
|
|
{
|
|
|
|
CURL* curl = curl_easy_init();
|
|
|
|
if (!curl)
|
|
|
|
{
|
|
|
|
Error(eDLL_T::COMMON, NO_ERROR, "CURL: %s\n", "Easy init failed");
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
string filePath = savePath;
|
|
|
|
|
|
|
|
AppendSlash(filePath);
|
|
|
|
filePath.append(fileName);
|
|
|
|
|
|
|
|
FILE* file = fopen(filePath.c_str(), options);
|
|
|
|
if (!file)
|
|
|
|
{
|
|
|
|
Error(eDLL_T::COMMON, NO_ERROR, "CURL: %s\n", "Open file failed");
|
|
|
|
curl_easy_cleanup(curl);
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
CURLProgress progressData;
|
|
|
|
|
|
|
|
progressData.curl = curl;
|
|
|
|
progressData.name = fileName;
|
|
|
|
progressData.cust = customPointer;
|
|
|
|
progressData.size = dataSize;
|
|
|
|
|
|
|
|
CURLInitCommonOptions(curl, remote, file,
|
|
|
|
params.writeFunction,
|
|
|
|
params.timeout,
|
|
|
|
params.verifyPeer,
|
|
|
|
params.verbose);
|
|
|
|
|
|
|
|
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1l);
|
|
|
|
|
|
|
|
if (params.statusFunction)
|
|
|
|
{
|
|
|
|
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0l);
|
|
|
|
curl_easy_setopt(curl, CURLOPT_XFERINFODATA, &progressData);
|
|
|
|
curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, params.statusFunction);
|
|
|
|
}
|
|
|
|
|
|
|
|
CURLcode res = curl_easy_perform(curl);
|
|
|
|
|
|
|
|
if (res != CURLE_OK)
|
|
|
|
{
|
|
|
|
Error(eDLL_T::COMMON, NO_ERROR, "CURL: Download of file '%s' failed; %s\n",
|
|
|
|
fileName, curl_easy_strerror(res));
|
|
|
|
|
|
|
|
curl_easy_cleanup(curl);
|
|
|
|
fclose(file);
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
curl_easy_cleanup(curl);
|
|
|
|
fclose(file);
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
CURL* CURLInitRequest(const char* remote, const char* request,
|
|
|
|
string& outResponse, curl_slist*& slist, CURLParams& params)
|
2023-01-26 19:54:38 +01:00
|
|
|
{
|
|
|
|
std::function<void(const char*)> fnError = [&](const char* errorMsg)
|
|
|
|
{
|
2023-07-22 21:14:04 +02:00
|
|
|
Error(eDLL_T::COMMON, NO_ERROR, "CURL: %s\n", errorMsg);
|
2023-01-26 19:54:38 +01:00
|
|
|
curl_slist_free_all(slist);
|
|
|
|
};
|
|
|
|
|
|
|
|
slist = curl_slist_append(slist, "Content-Type: application/json");
|
|
|
|
if (!slist)
|
|
|
|
{
|
|
|
|
fnError("Slist init failed");
|
2023-02-09 22:56:13 +01:00
|
|
|
return nullptr;
|
2023-01-26 19:54:38 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
CURL* curl = curl_easy_init();
|
|
|
|
if (!curl)
|
|
|
|
{
|
|
|
|
fnError("Easy init failed");
|
2023-02-09 22:56:13 +01:00
|
|
|
return nullptr;
|
2023-01-26 19:54:38 +01:00
|
|
|
}
|
|
|
|
|
2023-07-28 14:47:20 +02:00
|
|
|
CURLInitCommonOptions(curl, remote, &outResponse,
|
|
|
|
params.writeFunction,
|
|
|
|
params.timeout,
|
|
|
|
params.verifyPeer,
|
|
|
|
params.verbose);
|
2023-01-26 19:54:38 +01:00
|
|
|
|
2023-07-28 14:47:20 +02:00
|
|
|
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist);
|
|
|
|
if (request)
|
2023-01-30 00:04:11 +01:00
|
|
|
{
|
2023-07-28 14:47:20 +02:00
|
|
|
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, request);
|
|
|
|
curl_easy_setopt(curl, CURLOPT_POST, 1L);
|
2023-01-30 00:04:11 +01:00
|
|
|
}
|
|
|
|
|
2023-01-26 19:54:38 +01:00
|
|
|
return curl;
|
|
|
|
}
|
|
|
|
|
2023-02-09 22:56:13 +01:00
|
|
|
CURLcode CURLSubmitRequest(CURL* curl, curl_slist*& slist)
|
2023-01-26 19:54:38 +01:00
|
|
|
{
|
|
|
|
CURLcode res = curl_easy_perform(curl);
|
|
|
|
curl_slist_free_all(slist);
|
|
|
|
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
CURLINFO CURLRetrieveInfo(CURL* curl)
|
|
|
|
{
|
|
|
|
CURLINFO status;
|
|
|
|
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
|
|
|
|
curl_easy_cleanup(curl);
|
|
|
|
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
|
2023-06-02 00:05:23 +02:00
|
|
|
bool CURLHandleError(CURL* curl, const CURLcode res, string& outMessage, const bool logError)
|
2023-01-26 19:54:38 +01:00
|
|
|
{
|
|
|
|
if (res == CURLE_OK)
|
|
|
|
return true;
|
|
|
|
|
|
|
|
const char* curlError = curl_easy_strerror(res);
|
2023-06-02 00:05:23 +02:00
|
|
|
|
|
|
|
if (logError)
|
2023-07-22 21:14:04 +02:00
|
|
|
Error(eDLL_T::COMMON, NO_ERROR, "CURL: %s\n", curlError);
|
2023-01-26 19:54:38 +01:00
|
|
|
|
|
|
|
outMessage = curlError;
|
|
|
|
curl_easy_cleanup(curl);
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2023-04-25 22:51:06 +02:00
|
|
|
void CURLFormatUrl(string& outUrl, const char* host, const char* api)
|
2023-01-26 19:54:38 +01:00
|
|
|
{
|
2023-04-25 22:51:06 +02:00
|
|
|
outUrl = Format("%s%s%s", "https://", host, api);
|
2023-04-08 10:50:32 +02:00
|
|
|
}
|