comparison src/core/http.cc @ 317:b1f4d1867ab1

services: VERY initial Kitsu support it only supports user authentication for now, but it's definitely a start.
author Paper <paper@paper.us.eu.org>
date Wed, 12 Jun 2024 04:07:10 -0400
parents b1f625b0227c
children d928ec7b6a0d
comparison
equal deleted inserted replaced
316:180714442770 317:b1f4d1867ab1
5 #include <iostream> 5 #include <iostream>
6 #include <string> 6 #include <string>
7 #include <vector> 7 #include <vector>
8 8
9 namespace HTTP { 9 namespace HTTP {
10
11 std::string UrlEncode(const std::string& data) {
12 /* why do I need to init curl just for this? wtf? */
13 CURL *curl = curl_easy_init();
14 if (!curl)
15 return ""; /* no way! */
16
17 char* output = curl_easy_escape(curl, data.data(), data.size());
18 if (!output) {
19 curl_easy_cleanup(curl);
20 return "";
21 }
22
23 std::string str(output);
24
25 curl_free(output);
26 curl_easy_cleanup(curl);
27
28 return str;
29 }
30
31 std::string UrlDecode(const std::string& data) {
32 CURL *curl = curl_easy_init();
33 if (!curl)
34 return "";
35
36 int outlength;
37 char* output = curl_easy_unescape(curl, data.data(), data.size(), &outlength);
38 if (!output) {
39 curl_easy_cleanup(curl);
40 return "";
41 }
42
43 std::string str(output, outlength);
44
45 curl_free(output);
46 curl_easy_cleanup(curl);
47
48 return str;
49 }
50
51 std::string EncodeParamsList(std::string base, const std::map<std::string, std::string>& params) {
52 std::size_t count = 0;
53 for (const auto& param : params) {
54 base += (!count ? "?" : "&");
55 base += UrlEncode(param.first);
56 base += "=";
57 base += UrlEncode(param.second);
58
59 count++;
60 }
61
62 return base;
63 }
10 64
11 static size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userdata) { 65 static size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userdata) {
12 reinterpret_cast<QByteArray*>(userdata)->append(reinterpret_cast<char*>(contents), size * nmemb); 66 reinterpret_cast<QByteArray*>(userdata)->append(reinterpret_cast<char*>(contents), size * nmemb);
13 return size * nmemb; 67 return size * nmemb;
14 } 68 }
33 curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); // threading 87 curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); // threading
34 CURLcode res = curl_easy_perform(curl); 88 CURLcode res = curl_easy_perform(curl);
35 session.IncrementRequests(); 89 session.IncrementRequests();
36 curl_easy_cleanup(curl); 90 curl_easy_cleanup(curl);
37 if (res != CURLE_OK) 91 if (res != CURLE_OK)
38 std::cerr << "curl_easy_perform(curl) failed!: " << curl_easy_strerror(res) << std::endl; 92 session.SetStatusBar(std::string("curl_easy_perform(curl) failed!: ") + curl_easy_strerror(res));
39 } 93 }
40 return userdata; 94 return userdata;
41 } 95 }
42 96
43 /* this function is static */ 97 /* this function is static */
120 session.IncrementRequests(); 174 session.IncrementRequests();
121 curl_easy_cleanup(curl); 175 curl_easy_cleanup(curl);
122 176
123 callback_data_mutex_.lock(); 177 callback_data_mutex_.lock();
124 if (res != CURLE_OK && !(res == CURLE_WRITE_ERROR && cancelled_)) 178 if (res != CURLE_OK && !(res == CURLE_WRITE_ERROR && cancelled_))
125 std::cerr << "curl_easy_perform(curl) failed!: " << curl_easy_strerror(res) << std::endl; 179 session.SetStatusBar(std::string("curl_easy_perform(curl) failed!: ") + curl_easy_strerror(res));
126 callback_data_mutex_.unlock(); 180 callback_data_mutex_.unlock();
127 } 181 }
128 182
129 emit ReceivedData(array_); 183 emit ReceivedData(array_);
130 array_.clear(); 184 array_.clear();