1
0
This repository has been archived on 2025-07-27. You can view files and clone it, but cannot push or open issues or pull requests.
Files
siadrive/SiaDrive.Api/SiaCurl.cpp
Scott E. Graves 352363b25d [Unit Test] Server version mismatch
[Unit Test] Empty required server version
API and curl changes
2017-02-02 23:51:42 -06:00

87 lines
2.2 KiB
C++

#include "stdafx.h"
#include "SiaCurl.h"
#include <curl/curl.h>
using namespace Sia::Api;
CSiaCurl::CSiaCurl() :
_curlHandle(curl_easy_init())
{
SetHostConfig({ L"localhost", 9980, L""});
curl_easy_setopt(_curlHandle, CURLOPT_USERAGENT, "Sia-Agent");
}
CSiaCurl::~CSiaCurl()
{
curl_easy_cleanup(_curlHandle);
}
SiaCurlError CSiaCurl::_Get(const String& path, json& response) const
{
std::string result;
SiaCurlError ret = SiaCurlError::Success;
if (API_SUCCESS(SiaCurlError, ret))
{
curl_easy_setopt(_curlHandle, CURLOPT_URL, ConstructPath(path).c_str());
curl_easy_setopt(_curlHandle, CURLOPT_WRITEFUNCTION, static_cast<size_t(*)(char*, size_t, size_t, void *)>([](char *buffer, size_t size, size_t nitems, void *outstream) -> size_t
{
(*reinterpret_cast<std::string*>(outstream)) += std::string(reinterpret_cast<LPCSTR>(buffer), size * nitems);
return size * nitems;
}));
curl_easy_setopt(_curlHandle, CURLOPT_WRITEDATA, &result);
const CURLcode res = curl_easy_perform(_curlHandle);
if (res != CURLE_OK)
{
ret = SiaCurlError::Failed;
}
response = json::parse(result.c_str());
}
return ret;
}
bool CSiaCurl::CheckVersion(SiaCurlError& error) const
{
error = SiaCurlError::InvalidRequiredVersion;
if (GetHostConfig().RequiredVersion.length())
{
error = SiaCurlError::NoResponse;
const String serverVersion = GetServerVersion();
if (serverVersion.length())
{
error = (serverVersion == GetHostConfig().RequiredVersion) ? SiaCurlError::Success : SiaCurlError::ServerVersionMismatch;
}
}
return API_SUCCESS(SiaCurlError, error);
}
std::string CSiaCurl::ConstructPath(const String& relativePath) const
{
const std::string ret = "http://" + std::string(CW2A(GetHostConfig().HostName.c_str()))+ ":" + std::to_string(GetHostConfig().HostPort) + std::string(CW2A(relativePath.c_str()));
return ret;
}
String CSiaCurl::GetServerVersion() const
{
json response;
if (API_SUCCESS(SiaCurlError, _Get(L"/daemon/version", response)))
{
return String(CA2W(response["version"].get<std::string>().c_str()));
}
return L"";
}
SiaCurlError CSiaCurl::Get(const String& path, json& response) const
{
std::string result;
SiaCurlError ret;
if (CheckVersion(ret))
{
ret = _Get(path, response);
}
return ret;
}