annotate src/core/http.cc @ 397:811697ad826a

http: do proper global init/cleanup of libcurl this is done automagically using RAII
author Paper <paper@tflc.us>
date Fri, 07 Nov 2025 08:39:24 -0500
parents 8ed3b5e8f205
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
301
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
1 #include "core/http.h"
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
2 #include "core/session.h"
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
3 #include <QByteArray>
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
4 #include <curl/curl.h>
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
5 #include <iostream>
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
6 #include <string>
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
7 #include <vector>
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
8
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
9 namespace HTTP {
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
10
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
11 std::string UrlEncode(const std::string &data)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
12 {
317
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
13 /* why do I need to init curl just for this? wtf? */
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
14 CURL *curl = curl_easy_init();
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
15 if (!curl)
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
16 return ""; /* no way! */
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
17
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
18 char *output = curl_easy_escape(curl, data.data(), data.size());
317
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
19 if (!output) {
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
20 curl_easy_cleanup(curl);
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
21 return "";
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
22 }
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
23
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
24 std::string str(output);
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
25
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
26 curl_free(output);
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
27 curl_easy_cleanup(curl);
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
28
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
29 return str;
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
30 }
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
31
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
32 std::string UrlDecode(const std::string &data)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
33 {
317
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
34 CURL *curl = curl_easy_init();
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
35 if (!curl)
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
36 return "";
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
37
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
38 int outlength;
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
39 char *output = curl_easy_unescape(curl, data.data(), data.size(), &outlength);
317
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
40 if (!output) {
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
41 curl_easy_cleanup(curl);
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
42 return "";
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
43 }
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
44
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
45 std::string str(output, outlength);
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
46
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
47 curl_free(output);
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
48 curl_easy_cleanup(curl);
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
49
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
50 return str;
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
51 }
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
52
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
53 std::string EncodeParamsList(std::string base, const std::map<std::string, std::string> &params)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
54 {
317
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
55 std::size_t count = 0;
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
56 for (const auto &param : params) {
317
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
57 base += (!count ? "?" : "&");
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
58 base += UrlEncode(param.first);
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
59 base += "=";
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
60 base += UrlEncode(param.second);
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
61
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
62 count++;
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
63 }
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
64
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
65 return base;
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
66 }
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
67
393
963047512d34 *: clang-format
Paper <paper@tflc.us>
parents: 390
diff changeset
68 static void SetCurlOpts(CURL *curl, const std::string &url, const std::vector<std::string> &headers,
963047512d34 *: clang-format
Paper <paper@tflc.us>
parents: 390
diff changeset
69 const std::string &data, Type type)
390
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
70 {
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
71 struct curl_slist *list;
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
72
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
73 curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
74
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
75 list = NULL;
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
76 for (const std::string &h : headers)
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
77 list = curl_slist_append(list, h.c_str());
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
78 curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
79
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
80 switch (type) {
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
81 case Type::Patch:
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
82 curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PATCH");
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
83 [[fallthrough]];
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
84 case Type::Post:
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
85 curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data.c_str());
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
86 break;
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
87 case Type::Get:
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
88 break;
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
89 }
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
90
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
91 curl_easy_setopt(curl, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA);
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
92 curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L); // threading
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
93 }
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
94
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
95 static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userdata)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
96 {
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
97 reinterpret_cast<QByteArray *>(userdata)->append(reinterpret_cast<char *>(contents), size * nmemb);
301
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
98 return size * nmemb;
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
99 }
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
100
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
101 QByteArray Request(const std::string &url, const std::vector<std::string> &headers, const std::string &data, Type type)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
102 {
301
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
103 QByteArray userdata;
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
104
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
105 CURL *curl = curl_easy_init();
301
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
106 if (curl) {
390
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
107 SetCurlOpts(curl, url, headers, data, type);
301
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
108
390
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
109 /* Use our specific userdata & write callback
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
110 * TODO can this just be a lambda instead */
301
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
111 curl_easy_setopt(curl, CURLOPT_WRITEDATA, &userdata);
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
112 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &WriteCallback);
390
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
113
301
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
114 CURLcode res = curl_easy_perform(curl);
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
115 session.IncrementRequests();
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
116 curl_easy_cleanup(curl);
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
117 if (res != CURLE_OK)
317
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
118 session.SetStatusBar(std::string("curl_easy_perform(curl) failed!: ") + curl_easy_strerror(res));
301
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
119 }
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
120 return userdata;
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
121 }
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
122
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
123 /* this function is static */
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
124 size_t RequestThread::WriteCallback(void *contents, size_t size, size_t nmemb, void *userdata)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
125 {
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
126 RequestThread *thread = reinterpret_cast<RequestThread *>(userdata);
301
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
127
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
128 if (thread->cancelled_)
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
129 return CURL_WRITEFUNC_ERROR;
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
130
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
131 /* else, continue on as normal */
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
132 thread->array_.append(reinterpret_cast<char *>(contents), size * nmemb);
301
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
133 return size * nmemb;
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
134 }
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
135
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
136 RequestThread::RequestThread(Type type, QObject *parent) : QThread(parent)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
137 {
301
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
138 SetType(type);
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
139 }
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
140
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
141 RequestThread::RequestThread(const std::string &url, const std::vector<std::string> &headers, const std::string &data,
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
142 Type type, QObject *parent)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
143 : QThread(parent)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
144 {
301
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
145 SetUrl(url);
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
146 SetData(data);
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
147 SetHeaders(headers);
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
148 SetType(type);
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
149 }
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
150
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
151 RequestThread::~RequestThread()
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
152 {
319
d928ec7b6a0d services/kitsu: implement GetAnimeList()
Paper <paper@paper.us.eu.org>
parents: 317
diff changeset
153 /* block until the function can safely exit */
301
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
154 Stop();
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
155 wait();
390
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
156
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
157 /* Kill off any curl thing we made */
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
158 if (curl_)
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
159 curl_easy_cleanup(reinterpret_cast<CURL *>(curl_));
301
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
160 }
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
161
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
162 void RequestThread::SetUrl(const std::string &url)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
163 {
301
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
164 url_ = url;
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
165 }
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
166
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
167 void RequestThread::SetHeaders(const std::vector<std::string> &headers)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
168 {
301
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
169 headers_ = headers;
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
170 }
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
171
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
172 void RequestThread::SetData(const std::string &data)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
173 {
301
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
174 data_ = data;
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
175 }
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
176
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
177 void RequestThread::SetType(Type type)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
178 {
301
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
179 type_ = type;
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
180 }
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
181
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
182 void RequestThread::run()
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
183 {
390
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
184 /* If we don't have a curl object, create one */
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
185 if (!curl_) {
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
186 curl_ = reinterpret_cast<void *>(curl_easy_init());
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
187 }
301
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
188
390
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
189 CURL *curl = reinterpret_cast<CURL *>(curl_);
301
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
190
390
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
191 if (curl) {
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
192 SetCurlOpts(curl, url_, headers_, data_, type_);
301
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
193
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
194 curl_easy_setopt(curl, CURLOPT_WRITEDATA, this);
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
195 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &RequestThread::WriteCallback);
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
196
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
197 CURLcode res = curl_easy_perform(curl);
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
198 session.IncrementRequests();
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
199
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
200 if (res != CURLE_OK && !(res == CURLE_WRITE_ERROR && cancelled_))
317
b1f4d1867ab1 services: VERY initial Kitsu support
Paper <paper@paper.us.eu.org>
parents: 301
diff changeset
201 session.SetStatusBar(std::string("curl_easy_perform(curl) failed!: ") + curl_easy_strerror(res));
301
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
202 }
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
203
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
204 emit ReceivedData(array_);
390
2d3e10319112 http: optimize HTTP request thread
Paper <paper@tflc.us>
parents: 389
diff changeset
205 /* Clear it out for any subsequent runs */
301
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
206 array_.clear();
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
207 }
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
208
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
209 void RequestThread::Stop()
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 319
diff changeset
210 {
301
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
211 cancelled_ = true;
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
212 }
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
213
397
811697ad826a http: do proper global init/cleanup of libcurl
Paper <paper@tflc.us>
parents: 396
diff changeset
214 void Init()
811697ad826a http: do proper global init/cleanup of libcurl
Paper <paper@tflc.us>
parents: 396
diff changeset
215 {
811697ad826a http: do proper global init/cleanup of libcurl
Paper <paper@tflc.us>
parents: 396
diff changeset
216 curl_global_init(CURL_GLOBAL_ALL);
811697ad826a http: do proper global init/cleanup of libcurl
Paper <paper@tflc.us>
parents: 396
diff changeset
217 }
811697ad826a http: do proper global init/cleanup of libcurl
Paper <paper@tflc.us>
parents: 396
diff changeset
218
811697ad826a http: do proper global init/cleanup of libcurl
Paper <paper@tflc.us>
parents: 396
diff changeset
219 void Quit()
811697ad826a http: do proper global init/cleanup of libcurl
Paper <paper@tflc.us>
parents: 396
diff changeset
220 {
811697ad826a http: do proper global init/cleanup of libcurl
Paper <paper@tflc.us>
parents: 396
diff changeset
221 curl_global_cleanup();
811697ad826a http: do proper global init/cleanup of libcurl
Paper <paper@tflc.us>
parents: 396
diff changeset
222 }
811697ad826a http: do proper global init/cleanup of libcurl
Paper <paper@tflc.us>
parents: 396
diff changeset
223
301
b1f625b0227c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 291
diff changeset
224 } // namespace HTTP