82 lines
2.4 KiB
C++
82 lines
2.4 KiB
C++
#include "restclient.h"
|
|
|
|
#include <Log.h>
|
|
|
|
static size_t arrayWriteCallback(char* contents, size_t size, size_t nmemb, void* userdata) {
|
|
if(userdata) {
|
|
QByteArray* arr = (QByteArray*) userdata;
|
|
arr->append(contents, size * nmemb);
|
|
return size * nmemb;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
RestClient::RestClient(const std::string& base) : baseurl(base) {
|
|
curl = curl_easy_init();
|
|
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
|
|
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, arrayWriteCallback);
|
|
}
|
|
|
|
RestClient::~RestClient() {
|
|
curl_easy_cleanup(curl);
|
|
curl = nullptr;
|
|
}
|
|
|
|
QByteArray RestClient::requestRaw(const std::string& url, Method m) {
|
|
if(!curl) return {};
|
|
|
|
std::string requrl = baseurl + url;
|
|
QByteArray ba; //buffer
|
|
// std::cout << "[DEBUG] requrl is: " << requrl << std::endl;
|
|
curl_easy_setopt(curl, CURLOPT_URL, requrl.c_str());
|
|
|
|
// curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); //Prevent "longjmp causes uninitialized stack frame" bug
|
|
// set callback data
|
|
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ba);
|
|
|
|
curl_easy_setopt(curl, CURLOPT_USERPWD, basicauth.c_str());
|
|
curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
|
|
if(disableCertCheck) {
|
|
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
|
|
}
|
|
|
|
switch (m) {
|
|
default:
|
|
case Method::GET:
|
|
curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); break;
|
|
case Method::POST:
|
|
curl_easy_setopt(curl, CURLOPT_POST, 1L); break;
|
|
case Method::PUT:
|
|
curl_easy_setopt(curl, CURLOPT_PUT, 1L); break;
|
|
case Method::DELETE:
|
|
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE"); break;
|
|
}
|
|
|
|
// Check for errors
|
|
CURLcode res = curl_easy_perform(curl);
|
|
if (res != CURLE_OK) {
|
|
if(res == CURLE_HTTP_RETURNED_ERROR) {
|
|
long responsecode = -1;
|
|
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &responsecode);
|
|
Log::warn << "API request failed: " << baseurl << " " << url << " -> " << responsecode ;
|
|
} else {
|
|
Log::warn << "API request failed: " << baseurl << " " << url << " " << curl_easy_strerror(res);
|
|
}
|
|
return {};
|
|
}
|
|
return ba;
|
|
}
|
|
|
|
QJsonDocument RestClient::request(const std::string& url, Method m) {
|
|
QByteArray arr = requestRaw(url, m);
|
|
if(arr.isEmpty()) return {};
|
|
|
|
QJsonParseError err;
|
|
QJsonDocument parsed = QJsonDocument::fromJson(arr, &err);
|
|
if(parsed.isNull() || err.error != QJsonParseError::NoError) {
|
|
Log::error << "API Json parse error " << err.errorString().toStdString() << " offset: " << err.offset;
|
|
return {};
|
|
}
|
|
|
|
return parsed;
|
|
} |