Merge branch 'indev' into launcher_rework

This commit is contained in:
Kawe Mazidjatari 2023-07-28 14:50:55 +02:00
commit 682e7d8847
5 changed files with 154 additions and 25 deletions

View File

@ -361,9 +361,15 @@ bool CPylon::QueryServer(const char* endpoint, const char* request,
string finalUrl; string finalUrl;
CURLFormatUrl(finalUrl, hostName, endpoint); CURLFormatUrl(finalUrl, hostName, endpoint);
CURLParams params;
params.writeFunction = CURLWriteStringCallback;
params.timeout = curl_timeout->GetInt();
params.verifyPeer = ssl_verify_peer->GetBool();
params.verbose = curl_debug->GetBool();
curl_slist* sList = nullptr; curl_slist* sList = nullptr;
CURL* curl = CURLInitRequest(finalUrl.c_str(), request, outResponse, sList, CURL* curl = CURLInitRequest(finalUrl.c_str(), request, outResponse, sList, params);
curl_timeout->GetInt(), ssl_verify_peer->GetBool(), curl_debug->GetBool());
if (!curl) if (!curl)
{ {
return false; return false;

View File

@ -33,6 +33,8 @@ string CreateTimedFileName();
string CreateUUID(); string CreateUUID();
void CreateDirectories(string svInput, string* pszOutput = nullptr, bool bWindows = false); void CreateDirectories(string svInput, string* pszOutput = nullptr, bool bWindows = false);
void AppendSlash(string& svInput, const char separator = '\\');
string ConvertToWinPath(const string& svInput); string ConvertToWinPath(const string& svInput);
string ConvertToUnixPath(const string& svInput); string ConvertToUnixPath(const string& svInput);

View File

@ -3,14 +3,45 @@
struct CURLProgress struct CURLProgress
{ {
CURL* priv; CURLProgress()
: curl(nullptr)
, name(nullptr)
, cust(nullptr)
, size(0)
{}
CURL* curl;
const char* name;
void* cust; // custom pointer to anything.
size_t size; size_t size;
}; };
size_t CURLWriteStringCallback(char* contents, const size_t size, const size_t nmemb, void* userp); struct CURLParams
{
CURLParams()
: writeFunction(nullptr)
, statusFunction(nullptr)
, timeout(0)
, verifyPeer(false)
, verbose(false)
{}
void* writeFunction;
void* statusFunction;
int timeout;
bool verifyPeer;
bool verbose;
};
size_t CURLWriteStringCallback(char* contents, const size_t size, const size_t nmemb, string* userp);
size_t CURLWriteFileCallback(void* data, const size_t size, const size_t nmemb, FILE* userp);
bool CURLDownloadFile(const char* remote, const char* savePath, const char* fileName,
const char* options, curl_off_t dataSize, void* customPointer, CURLParams& params);
CURL* CURLInitRequest(const char* remote, const char* request, string& outResponse, curl_slist*& slist, CURLParams& params);
CURL* CURLInitRequest(const char* remote, const char* request, string& outResponse, curl_slist*& slist,
const int timeOut, const bool verifyPeer, const bool debug, const void* writeFunction = CURLWriteStringCallback);
CURLcode CURLSubmitRequest(CURL* curl, curl_slist*& slist); CURLcode CURLSubmitRequest(CURL* curl, curl_slist*& slist);
CURLINFO CURLRetrieveInfo(CURL* curl); CURLINFO CURLRetrieveInfo(CURL* curl);

View File

@ -409,6 +409,17 @@ void CreateDirectories(string svInput, string* pszOutput, bool bWindows)
fs::create_directories(fspPathOut); fs::create_directories(fspPathOut);
} }
///////////////////////////////////////////////////////////////////////////////
// For appending a slash at the end of the string if not already present.
void AppendSlash(string& svInput, const char separator)
{
char lchar = svInput[svInput.size() - 1];
if (lchar != '\\' && lchar != '/')
{
svInput.push_back(separator);
}
}
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// For converting file paths to windows file paths. // For converting file paths to windows file paths.
string ConvertToWinPath(const string& svInput) string ConvertToWinPath(const string& svInput)

View File

@ -6,14 +6,99 @@
#include "tier1/cvar.h" #include "tier1/cvar.h"
#include "tier2/curlutils.h" #include "tier2/curlutils.h"
size_t CURLWriteStringCallback(char* contents, const size_t size, const size_t nmemb, void* userp) size_t CURLWriteStringCallback(char* data, const size_t size, const size_t nmemb, string* userp)
{ {
reinterpret_cast<string*>(userp)->append(contents, size * nmemb); userp->append(data, size * nmemb);
return size * nmemb; return size * nmemb;
} }
CURL* CURLInitRequest(const char* remote, const char* request, string& outResponse, curl_slist*& slist, size_t CURLWriteFileCallback(void* data, const size_t size, const size_t nmemb, FILE* userp)
const int timeOut, const bool verifyPeer, const bool debug, const void* writeFunction) {
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)
{ {
std::function<void(const char*)> fnError = [&](const char* errorMsg) std::function<void(const char*)> fnError = [&](const char* errorMsg)
{ {
@ -35,23 +120,17 @@ CURL* CURLInitRequest(const char* remote, const char* request, string& outRespon
return nullptr; return nullptr;
} }
CURLInitCommonOptions(curl, remote, &outResponse,
params.writeFunction,
params.timeout,
params.verifyPeer,
params.verbose);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist);
curl_easy_setopt(curl, CURLOPT_URL, remote); if (request)
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, request);
curl_easy_setopt(curl, CURLOPT_POST, 1L);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeOut);
curl_easy_setopt(curl, CURLOPT_USERAGENT, "R5R HTTPS/1.0");
curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_ALL);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeFunction);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &outResponse);
curl_easy_setopt(curl, CURLOPT_VERBOSE, debug);
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);
if (!verifyPeer)
{ {
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, request);
curl_easy_setopt(curl, CURLOPT_POST, 1L);
} }
return curl; return curl;