10 #define CHECK_OOM(code)
11 if ((code) == CURLE_OUT_OF_MEMORY)
12 return {std::bad_alloc{}}
22 CURL *curl = curl_easy_init();
28 curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
32 curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);
35 curl_easy_setopt(curl, CURLOPT_BUFFERSIZE, buffer_size);
38 curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
41 return {Easy_ptr{
static_cast<
char*>(curl)}};
43 auto curl_t::
dup_easy(
const Easy_t &e, std::size_t buffer_size)
noexcept -> Easy_t
45 CURL *curl = curl_easy_duphandle(e.get());
51 curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
55 curl_easy_setopt(curl, CURLOPT_BUFFERSIZE, buffer_size);
58 curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
61 return {Easy_ptr{
static_cast<
char*>(curl)}};
66 if (stderr_stream_arg) {
67 curl_easy_setopt(curl_easy, CURLOPT_STDERR, stderr_stream_arg);
68 curl_easy_setopt(curl_easy, CURLOPT_VERBOSE, 1L);
73 return CURL_ERROR_SIZE;
77 curl_easy_setopt(curl_easy, CURLOPT_ERRORBUFFER, error_buffer);
82 curl_easy_setopt(curl_easy, CURLOPT_PRIVATE, userp);
87 curl_easy_getinfo(curl_easy, CURLINFO_PRIVATE, &userp);
93 curl_easy_setopt(curl_easy, CURLOPT_WRITEFUNCTION, writeback);
94 curl_easy_setopt(curl_easy, CURLOPT_WRITEDATA, userp);
99 curl_easy_setopt(curl_easy, CURLOPT_CURLU, url
.url);
103 CHECK_OOM(curl_easy_setopt(curl_easy, CURLOPT_URL, url));
110 auto result = curl_easy_setopt(curl_easy, CURLOPT_PINNEDPUBLICKEY, pubkey);
111 if (result == CURLE_OUT_OF_MEMORY)
112 return {std::bad_alloc{}};
113 else if (result == CURLE_UNKNOWN_OPTION)
114 return {curl::
NotBuiltIn_error{
"pining public key is not supported by this version of libcurl "
115 "on this specific ssl version"}};
123 auto code = curl_easy_setopt(curl_easy, CURLOPT_COOKIE, cookies);
124 if (code == CURLE_UNKNOWN_OPTION)
126 else if (code == CURLE_OUT_OF_MEMORY)
127 return {std::bad_alloc{}};
134 if (curl_easy_setopt(curl_easy, CURLOPT_COOKIEFILE, cookie_filename) == CURLE_UNKNOWN_OPTION)
141 auto code = curl_easy_setopt(curl_easy, CURLOPT_COOKIEJAR, cookie_filename);
142 if (code == CURLE_UNKNOWN_OPTION)
144 else if (code == CURLE_OUT_OF_MEMORY)
145 return {std::bad_alloc{}};
152 auto code = curl_easy_setopt(curl_easy, CURLOPT_COOKIELIST, cookie);
153 if (code == CURLE_UNKNOWN_OPTION)
155 else if (code == CURLE_OUT_OF_MEMORY)
156 return {std::bad_alloc{}};
162 curl_easy_setopt(curl_easy, CURLOPT_COOKIESESSION, 1L);
188 curl_easy_setopt(curl_easy, CURLOPT_FOLLOWLOCATION, 1L);
189 curl_easy_setopt(curl_easy, CURLOPT_MAXREDIRS, redir);
191 curl_easy_setopt(curl_easy, CURLOPT_FOLLOWLOCATION, 0L);
196 CHECK_OOM(curl_easy_setopt(curl_easy, CURLOPT_USERAGENT, useragent));
201 CHECK_OOM(curl_easy_setopt(curl_easy, CURLOPT_ACCEPT_ENCODING, encoding));
207 CHECK_OOM(curl_easy_setopt(curl_easy, CURLOPT_INTERFACE, value));
219 constexpr const auto buffer_size = 5 + 46;
220 char buffer[buffer_size];
221 std::snprintf(buffer, buffer_size,
"host!%s", ip_addr);
228 curl_easy_setopt(curl_easy, CURLOPT_TIMEOUT_MS, timeout);
233 curl_easy_setopt(curl_easy, CURLOPT_HTTPHEADER,
static_cast<
struct curl_slist*>(l
.get_underlying_ptr()));
237 value = CURLHEADER_SEPARATE;
239 value = CURLHEADER_UNIFIED;
241 curl_easy_setopt(curl_easy, CURLOPT_HEADEROPT, value);
247 curl_easy_setopt(curl_easy, CURLOPT_NOBODY, enable);
252 curl_easy_setopt(curl_easy, CURLOPT_HTTPGET, 1L);
256 curl_easy_setopt(curl_easy, CURLOPT_POSTFIELDSIZE_LARGE, len);
257 curl_easy_setopt(curl_easy, CURLOPT_POSTFIELDS, data);
263 curl_easy_setopt(curl_easy, CURLOPT_READFUNCTION, readback);
264 curl_easy_setopt(curl_easy, CURLOPT_READDATA, userp);
267 auto Easy_ref_t::perform()
noexcept -> perform_ret_t
269 return check_perform(curl_easy_perform(curl_easy),
"curl::Easy_ref_t::perform");
276 return static_cast<type>(x) &
static_cast<type>(y);
282 bitmask |= CURLPAUSE_RECV;
284 bitmask |= CURLPAUSE_SEND;
286 auto result = curl_easy_pause(curl_easy, bitmask);
287 if (result == CURLE_WRITE_ERROR)
288 return {
code::writeback_error};
289 else if (result == CURLE_OUT_OF_MEMORY)
290 return {std::bad_alloc{}};
291 else if (result != CURLE_OK)
297 long Easy_ref_t::get_response_code()
const noexcept
300 curl_easy_getinfo(curl_easy, CURLINFO_RESPONSE_CODE, &response_code);
301 return response_code;
307 curl_easy_getinfo(curl_easy, CURLINFO_REQUEST_SIZE, &size);
313 if (curl_easy_getinfo(curl_easy, CURLINFO_SIZE_UPLOAD_T, &ul)) {
315 curl_easy_getinfo(curl_easy, CURLINFO_SIZE_UPLOAD, &bytes);
316 return static_cast<std::size_t>(bytes);
323 curl_easy_getinfo(curl_easy, CURLINFO_HEADER_SIZE, &size);
329 if (curl_easy_getinfo(curl_easy, CURLINFO_SIZE_DOWNLOAD_T, &dl) == CURLE_UNKNOWN_OPTION) {
331 curl_easy_getinfo(curl_easy, CURLINFO_SIZE_DOWNLOAD, &bytes);
332 return static_cast<std::size_t>(bytes);
339 if (curl_easy_getinfo(curl_easy, CURLINFO_TOTAL_TIME_T, &total) == CURLE_UNKNOWN_OPTION) {
341 curl_easy_getinfo(curl_easy, CURLINFO_TOTAL_TIME, &seconds);
342 return static_cast<std::size_t>(seconds * 1000);
350 curl_easy_getinfo(curl_easy, CURLINFO_REDIRECT_URL, &url);
356 curl_easy_getinfo(curl_easy, CURLINFO_EFFECTIVE_URL, &url);
363 curl_slist *cookies =
nullptr;
364 if (curl_easy_getinfo(curl_easy, CURLINFO_COOKIELIST, &cookies) == CURLE_UNKNOWN_OPTION)
367 return {utils::
slist{cookies}};
372 curl_socket_t socketfd = CURL_SOCKET_BAD;
373 curl_easy_getinfo(curl_easy, CURLINFO_ACTIVESOCKET, &socketfd);
380 curl_easy_setopt(curl_easy, CURLOPT_NOBODY, 1);