Mercurial > minori
comparison src/core/http.cpp @ 77:6f7385bd334c
*: update
formatted all source files, no more subclassing QThread... many other
changes :)
| author | Paper <mrpapersonic@gmail.com> |
|---|---|
| date | Fri, 06 Oct 2023 06:18:53 -0400 |
| parents | 3364fadc8a36 |
| children |
comparison
equal
deleted
inserted
replaced
| 76:3364fadc8a36 | 77:6f7385bd334c |
|---|---|
| 1 #include "core/http.h" | 1 #include "core/http.h" |
| 2 #include "core/session.h" | 2 #include "core/session.h" |
| 3 #include <QByteArray> | 3 #include <QByteArray> |
| 4 #include <QMessageBox> | 4 #include <QMessageBox> |
| 5 #include <QThread> | |
| 6 #include <curl/curl.h> | 5 #include <curl/curl.h> |
| 7 #include <string> | 6 #include <string> |
| 8 #include <vector> | 7 #include <vector> |
| 9 | 8 |
| 10 namespace HTTP { | 9 namespace HTTP { |
| 11 | 10 |
| 12 HttpGetThread::HttpGetThread(std::string url, std::vector<std::string> headers, QObject* parent) : QThread(parent) { | 11 static size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userdata) { |
| 13 _url = url; | |
| 14 _headers = headers; | |
| 15 } | |
| 16 | |
| 17 size_t HttpGetThread::WriteCallback(void* contents, size_t size, size_t nmemb, void* userdata) { | |
| 18 reinterpret_cast<QByteArray*>(userdata)->append(reinterpret_cast<char*>(contents), size * nmemb); | 12 reinterpret_cast<QByteArray*>(userdata)->append(reinterpret_cast<char*>(contents), size * nmemb); |
| 19 return size * nmemb; | 13 return size * nmemb; |
| 20 } | 14 } |
| 21 | 15 |
| 22 void HttpGetThread::run() { | 16 QByteArray Get(std::string url, std::vector<std::string> headers) { |
| 23 struct curl_slist* list = NULL; | 17 struct curl_slist* list = NULL; |
| 24 QByteArray userdata; | 18 QByteArray userdata; |
| 25 | 19 |
| 26 CURL* curl = curl_easy_init(); | 20 CURL* curl = curl_easy_init(); |
| 27 if (curl) { | 21 if (curl) { |
| 28 for (const std::string& h : _headers) { | 22 for (const std::string& h : headers) { |
| 29 list = curl_slist_append(list, h.c_str()); | 23 list = curl_slist_append(list, h.c_str()); |
| 30 } | 24 } |
| 31 curl_easy_setopt(curl, CURLOPT_URL, _url.c_str()); | 25 curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); |
| 26 curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list); | |
| 32 curl_easy_setopt(curl, CURLOPT_WRITEDATA, &userdata); | 27 curl_easy_setopt(curl, CURLOPT_WRITEDATA, &userdata); |
| 33 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &WriteCallback); | 28 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &WriteCallback); |
| 34 /* Use system certs... useful on Windows. */ | 29 /* Use system certs... useful on Windows. */ |
| 35 curl_easy_setopt(curl, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA); | 30 curl_easy_setopt(curl, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA); |
| 36 CURLcode res = curl_easy_perform(curl); | 31 CURLcode res = curl_easy_perform(curl); |
| 40 QMessageBox box(QMessageBox::Icon::Critical, "", | 35 QMessageBox box(QMessageBox::Icon::Critical, "", |
| 41 QString("curl_easy_perform(curl) failed!: ") + QString(curl_easy_strerror(res))); | 36 QString("curl_easy_perform(curl) failed!: ") + QString(curl_easy_strerror(res))); |
| 42 box.exec(); | 37 box.exec(); |
| 43 } | 38 } |
| 44 } | 39 } |
| 45 emit resultReady(userdata); | 40 return userdata; |
| 46 } | 41 } |
| 47 | 42 |
| 48 static size_t CurlWriteStringCallback(void* contents, size_t size, size_t nmemb, void* userdata) { | 43 QByteArray Post(std::string url, std::string data, std::vector<std::string> headers) { |
| 49 reinterpret_cast<std::string*>(userdata)->append(reinterpret_cast<char*>(contents), size * nmemb); | 44 struct curl_slist* list = NULL; |
| 50 return size * nmemb; | 45 QByteArray userdata; |
| 51 } | |
| 52 | 46 |
| 53 /* Performs a basic (blocking) post request */ | |
| 54 std::string PerformBasicPostRequest(std::string url, std::string data, std::vector<std::string> headers) { | |
| 55 struct curl_slist* list = NULL; | |
| 56 std::string userdata; | |
| 57 CURL* curl = curl_easy_init(); | 47 CURL* curl = curl_easy_init(); |
| 58 if (curl) { | 48 if (curl) { |
| 59 for (const std::string& h : headers) { | 49 for (const std::string& h : headers) { |
| 60 list = curl_slist_append(list, h.c_str()); | 50 list = curl_slist_append(list, h.c_str()); |
| 61 } | 51 } |
| 62 curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); | 52 curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); |
| 63 curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data.c_str()); | 53 curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data.c_str()); |
| 64 curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list); | 54 curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list); |
| 65 curl_easy_setopt(curl, CURLOPT_WRITEDATA, &userdata); | 55 curl_easy_setopt(curl, CURLOPT_WRITEDATA, &userdata); |
| 66 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &CurlWriteStringCallback); | 56 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &WriteCallback); |
| 67 /* Use system certs... useful on Windows. */ | 57 /* Use system certs... useful on Windows. */ |
| 68 curl_easy_setopt(curl, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA); | 58 curl_easy_setopt(curl, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA); |
| 69 CURLcode res = curl_easy_perform(curl); | 59 CURLcode res = curl_easy_perform(curl); |
| 70 session.IncrementRequests(); | 60 session.IncrementRequests(); |
| 71 curl_slist_free_all(list); | |
| 72 curl_easy_cleanup(curl); | 61 curl_easy_cleanup(curl); |
| 73 if (res != CURLE_OK) { | 62 if (res != CURLE_OK) { |
| 74 QMessageBox box(QMessageBox::Icon::Critical, "", | 63 QMessageBox box(QMessageBox::Icon::Critical, "", |
| 75 QString("curl_easy_perform(curl) failed!: ") + QString(curl_easy_strerror(res))); | 64 QString("curl_easy_perform(curl) failed!: ") + QString(curl_easy_strerror(res))); |
| 76 box.exec(); | 65 box.exec(); |
| 77 return ""; | |
| 78 } | 66 } |
| 79 return userdata; | |
| 80 } | 67 } |
| 81 return ""; | 68 return userdata; |
| 82 } | 69 } |
| 83 | 70 |
| 84 } // namespace HTTP | 71 } // namespace HTTP |
| 85 | |
| 86 #include "core/moc_http.cpp" |
