session.cpp
Go to the documentation of this file.
1 #include "cpr/session.h"
2 
3 #include <algorithm>
4 #include <functional>
5 #include <string>
6 
7 #include <curl/curl.h>
8 
9 #include "cpr/curlholder.h"
10 #include "cpr/util.h"
11 
12 namespace cpr {
13 
15  public:
16  Impl();
17 
18  void SetUrl(const Url& url);
19  void SetParameters(const Parameters& parameters);
20  void SetParameters(Parameters&& parameters);
21  void SetHeader(const Header& header);
22  void SetTimeout(const Timeout& timeout);
23  void SetConnectTimeout(const ConnectTimeout& timeout);
24  void SetAuth(const Authentication& auth);
25  void SetDigest(const Digest& auth);
26  void SetUserAgent(const UserAgent& ua);
27  void SetPayload(Payload&& payload);
28  void SetPayload(const Payload& payload);
29  void SetProxies(Proxies&& proxies);
30  void SetProxies(const Proxies& proxies);
31  void SetMultipart(Multipart&& multipart);
32  void SetMultipart(const Multipart& multipart);
33  void SetRedirect(const bool& redirect);
34  void SetMaxRedirects(const MaxRedirects& max_redirects);
35  void SetCookies(const Cookies& cookies);
36  void SetBody(Body&& body);
37  void SetBody(const Body& body);
38  void SetLowSpeed(const LowSpeed& low_speed);
39  void SetVerbose(const Verbose& verbose);
40  void SetVerifySsl(const VerifySsl& verify);
41 
42  Response Delete();
43  Response Get();
44  Response Head();
45  Response Options();
46  Response Patch();
47  Response Post();
48  Response Put();
49 
50  private:
51  std::unique_ptr<CurlHolder, std::function<void(CurlHolder*)>> curl_;
55 
57  static void freeHolder(CurlHolder* holder);
58  static CurlHolder* newHolder();
59 };
60 
62  curl_ = std::unique_ptr<CurlHolder, std::function<void(CurlHolder*)>>(newHolder(),
64  auto curl = curl_->handle;
65  if (curl) {
66  // Set up some sensible defaults
68  auto version = std::string{"curl/"} + std::string{version_info->version};
69  curl_easy_setopt(curl, CURLOPT_USERAGENT, version.data());
70  curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
71  curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
72  curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 50L);
73  curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, curl_->error);
74  curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "");
75 #ifdef CPR_CURL_NOSIGNAL
76  curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);
77 #endif
78 #if LIBCURL_VERSION_MAJOR >= 7
79 #if LIBCURL_VERSION_MINOR >= 25
80 #if LIBCURL_VERSION_PATCH >= 0
81  curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);
82 #endif
83 #endif
84 #endif
85  }
86 }
87 
89  curl_easy_cleanup(holder->handle);
90  curl_slist_free_all(holder->chunk);
91  curl_formfree(holder->formpost);
92  delete holder;
93 }
94 
96  CurlHolder* holder = new CurlHolder();
97  holder->handle = curl_easy_init();
98  holder->chunk = NULL;
99  holder->formpost = NULL;
100  return holder;
101 }
102 
103 void Session::Impl::SetUrl(const Url& url) {
104  url_ = url;
105 }
106 
107 void Session::Impl::SetParameters(const Parameters& parameters) {
108  parameters_ = parameters;
109 }
110 
112  parameters_ = std::move(parameters);
113 }
114 
115 void Session::Impl::SetHeader(const Header& header) {
116  auto curl = curl_->handle;
117  if (curl) {
118  struct curl_slist* chunk = NULL;
119  for (auto item = header.cbegin(); item != header.cend(); ++item) {
120  auto header_string = std::string{item->first};
121  if (item->second.empty()) {
122  header_string += ";";
123  } else {
124  header_string += ": " + item->second;
125  }
126 
127  auto temp = curl_slist_append(chunk, header_string.data());
128  if (temp) {
129  chunk = temp;
130  }
131  }
132  curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
133 
134  curl_slist_free_all(curl_->chunk);
135  curl_->chunk = chunk;
136  }
137 }
138 
140  auto curl = curl_->handle;
141  if (curl) {
142  curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, timeout.Milliseconds());
143  }
144 }
145 
147  auto curl = curl_->handle;
148  if (curl) {
149  curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, timeout.Milliseconds());
150  }
151 }
152 
154  auto curl = curl_->handle;
155  if (curl) {
156  curl_easy_setopt(curl, CURLOPT_VERBOSE, verbose.verbose);
157  }
158 }
159 
161  auto curl = curl_->handle;
162  if (curl) {
163  curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
164  curl_easy_setopt(curl, CURLOPT_USERPWD, auth.GetAuthString());
165  }
166 }
167 
169  auto curl = curl_->handle;
170  if (curl) {
171  curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
172  curl_easy_setopt(curl, CURLOPT_USERPWD, auth.GetAuthString());
173  }
174 }
175 
177  auto curl = curl_->handle;
178  if (curl) {
179  curl_easy_setopt(curl, CURLOPT_USERAGENT, ua.c_str());
180  }
181 }
182 
184  auto curl = curl_->handle;
185  if (curl) {
186  curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, payload.content.length());
187  curl_easy_setopt(curl, CURLOPT_COPYPOSTFIELDS, payload.content.data());
188  }
189 }
190 
191 void Session::Impl::SetPayload(const Payload& payload) {
192  auto curl = curl_->handle;
193  if (curl) {
194  curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, payload.content.length());
195  curl_easy_setopt(curl, CURLOPT_POSTFIELDS, payload.content.data());
196  }
197 }
198 
199 void Session::Impl::SetProxies(const Proxies& proxies) {
200  proxies_ = proxies;
201 }
202 
204  proxies_ = std::move(proxies);
205 }
206 
208  auto curl = curl_->handle;
209  if (curl) {
210  struct curl_httppost* formpost = NULL;
211  struct curl_httppost* lastptr = NULL;
212 
213  for (auto& part : multipart.parts) {
214  std::vector<struct curl_forms> formdata;
215  formdata.push_back({CURLFORM_COPYNAME, part.name.data()});
216  if (part.is_buffer) {
217  formdata.push_back({CURLFORM_BUFFER, part.value.data()});
218  formdata.push_back(
219  {CURLFORM_COPYCONTENTS, reinterpret_cast<const char*>(part.data)});
220  formdata.push_back(
221  {CURLFORM_CONTENTSLENGTH, reinterpret_cast<const char*>(part.datalen)});
222  } else if (part.is_file) {
223  formdata.push_back({CURLFORM_FILE, part.value.data()});
224  } else {
225  formdata.push_back({CURLFORM_COPYCONTENTS, part.value.data()});
226  }
227  if (!part.content_type.empty()) {
228  formdata.push_back({CURLFORM_CONTENTTYPE, part.content_type.data()});
229  }
230  formdata.push_back({CURLFORM_END, nullptr});
231  curl_formadd(&formpost, &lastptr, CURLFORM_ARRAY, formdata.data(), CURLFORM_END);
232  }
233  curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
234 
235  curl_formfree(curl_->formpost);
236  curl_->formpost = formpost;
237  }
238 }
239 
240 void Session::Impl::SetMultipart(const Multipart& multipart) {
241  auto curl = curl_->handle;
242  if (curl) {
243  struct curl_httppost* formpost = NULL;
244  struct curl_httppost* lastptr = NULL;
245 
246  for (auto& part : multipart.parts) {
247  std::vector<struct curl_forms> formdata;
248  formdata.push_back({CURLFORM_PTRNAME, part.name.data()});
249  if (part.is_buffer) {
250  formdata.push_back({CURLFORM_BUFFER, part.value.data()});
251  formdata.push_back({CURLFORM_BUFFERPTR, reinterpret_cast<const char*>(part.data)});
252  formdata.push_back(
253  {CURLFORM_BUFFERLENGTH, reinterpret_cast<const char*>(part.datalen)});
254  } else if (part.is_file) {
255  formdata.push_back({CURLFORM_FILE, part.value.data()});
256  } else {
257  formdata.push_back({CURLFORM_PTRCONTENTS, part.value.data()});
258  }
259  if (!part.content_type.empty()) {
260  formdata.push_back({CURLFORM_CONTENTTYPE, part.content_type.data()});
261  }
262  formdata.push_back({CURLFORM_END, nullptr});
263  curl_formadd(&formpost, &lastptr, CURLFORM_ARRAY, formdata.data(), CURLFORM_END);
264  }
265  curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
266 
267  curl_formfree(curl_->formpost);
268  curl_->formpost = formpost;
269  }
270 }
271 
272 void Session::Impl::SetRedirect(const bool& redirect) {
273  auto curl = curl_->handle;
274  if (curl) {
275  curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, std::int32_t(redirect));
276  }
277 }
278 
279 void Session::Impl::SetMaxRedirects(const MaxRedirects& max_redirects) {
280  auto curl = curl_->handle;
281  if (curl) {
282  curl_easy_setopt(curl, CURLOPT_MAXREDIRS, max_redirects.number_of_redirects);
283  }
284 }
285 
286 void Session::Impl::SetCookies(const Cookies& cookies) {
287  auto curl = curl_->handle;
288  if (curl) {
289  curl_easy_setopt(curl, CURLOPT_COOKIELIST, "ALL");
290  curl_easy_setopt(curl, CURLOPT_COOKIE, cookies.GetEncoded().data());
291  }
292 }
293 
295  auto curl = curl_->handle;
296  if (curl) {
297  curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, body.length());
298  curl_easy_setopt(curl, CURLOPT_COPYPOSTFIELDS, body.data());
299  }
300 }
301 
303  auto curl = curl_->handle;
304  if (curl) {
305  curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, body.length());
306  curl_easy_setopt(curl, CURLOPT_POSTFIELDS, body.data());
307  }
308 }
309 
310 void Session::Impl::SetLowSpeed(const LowSpeed& low_speed) {
311  auto curl = curl_->handle;
312  if (curl) {
313  curl_easy_setopt(curl, CURLOPT_LOW_SPEED_LIMIT, low_speed.limit);
314  curl_easy_setopt(curl, CURLOPT_LOW_SPEED_TIME, low_speed.time);
315  }
316 }
317 
319  auto curl = curl_->handle;
320  if (curl) {
321  curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, verify ? 1L : 0L);
322  curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, verify ? 2L : 0L);
323  }
324 }
325 
327  auto curl = curl_->handle;
328  if (curl) {
329  curl_easy_setopt(curl, CURLOPT_HTTPGET, 0L);
330  curl_easy_setopt(curl, CURLOPT_NOBODY, 0L);
331  curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE");
332  }
333 
334  return makeRequest(curl);
335 }
336 
338  auto curl = curl_->handle;
339  if (curl) {
340  curl_easy_setopt(curl, CURLOPT_NOBODY, 0L);
341  curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "GET");
342  }
343 
344  return makeRequest(curl);
345 }
346 
348  auto curl = curl_->handle;
349  if (curl) {
350  curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, NULL);
351  curl_easy_setopt(curl, CURLOPT_NOBODY, 1L);
352  }
353 
354  return makeRequest(curl);
355 }
356 
358  auto curl = curl_->handle;
359  if (curl) {
360  curl_easy_setopt(curl, CURLOPT_NOBODY, 0L);
361  curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "OPTIONS");
362  }
363 
364  return makeRequest(curl);
365 }
366 
368  auto curl = curl_->handle;
369  if (curl) {
370  curl_easy_setopt(curl, CURLOPT_NOBODY, 0L);
371  curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PATCH");
372  }
373 
374  return makeRequest(curl);
375 }
376 
378  auto curl = curl_->handle;
379  if (curl) {
380  curl_easy_setopt(curl, CURLOPT_NOBODY, 0L);
381  curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
382  }
383 
384  return makeRequest(curl);
385 }
386 
388  auto curl = curl_->handle;
389  if (curl) {
390  curl_easy_setopt(curl, CURLOPT_NOBODY, 0L);
391  curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT");
392  }
393 
394  return makeRequest(curl);
395 }
396 
398  if (!parameters_.content.empty()) {
399  Url new_url{url_ + "?" + parameters_.content};
400  curl_easy_setopt(curl, CURLOPT_URL, new_url.data());
401  } else {
402  curl_easy_setopt(curl, CURLOPT_URL, url_.data());
403  }
404 
405  auto protocol = url_.substr(0, url_.find(':'));
406  if (proxies_.has(protocol)) {
407  curl_easy_setopt(curl, CURLOPT_PROXY, proxies_[protocol].data());
408  } else {
409  curl_easy_setopt(curl, CURLOPT_PROXY, nullptr);
410  }
411 
412  curl_->error[0] = '\0';
413 
414  std::string response_string;
415  std::string header_string;
416  curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, cpr::util::writeFunction);
417  curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response_string);
418  curl_easy_setopt(curl, CURLOPT_HEADERDATA, &header_string);
419 
420  auto curl_error = curl_easy_perform(curl);
421 
422  char* raw_url;
423  long response_code;
424  double elapsed;
425  curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);
426  curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, &elapsed);
427  curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &raw_url);
428 
429  Cookies cookies;
430  struct curl_slist* raw_cookies;
431  curl_easy_getinfo(curl, CURLINFO_COOKIELIST, &raw_cookies);
432  for (struct curl_slist* nc = raw_cookies; nc; nc = nc->next) {
433  auto tokens = cpr::util::split(nc->data, '\t');
434  auto value = tokens.back();
435  tokens.pop_back();
436  cookies[tokens.back()] = value;
437  }
438  curl_slist_free_all(raw_cookies);
439 
440  return Response{static_cast<std::int32_t>(response_code),
441  std::move(response_string),
442  cpr::util::parseHeader(header_string),
443  std::move(raw_url),
444  elapsed,
445  std::move(cookies),
446  Error(curl_error, curl_->error)};
447 }
448 
449 // clang-format off
450 Session::Session() : pimpl_{ new Impl{} } {}
452 void Session::SetUrl(const Url& url) { pimpl_->SetUrl(url); }
453 void Session::SetParameters(const Parameters& parameters) { pimpl_->SetParameters(parameters); }
454 void Session::SetParameters(Parameters&& parameters) { pimpl_->SetParameters(std::move(parameters)); }
455 void Session::SetHeader(const Header& header) { pimpl_->SetHeader(header); }
456 void Session::SetTimeout(const Timeout& timeout) { pimpl_->SetTimeout(timeout); }
457 void Session::SetConnectTimeout(const ConnectTimeout& timeout) { pimpl_->SetConnectTimeout(timeout); }
458 void Session::SetAuth(const Authentication& auth) { pimpl_->SetAuth(auth); }
459 void Session::SetDigest(const Digest& auth) { pimpl_->SetDigest(auth); }
460 void Session::SetUserAgent(const UserAgent& ua) { pimpl_->SetUserAgent(ua); }
461 void Session::SetPayload(const Payload& payload) { pimpl_->SetPayload(payload); }
462 void Session::SetPayload(Payload&& payload) { pimpl_->SetPayload(std::move(payload)); }
463 void Session::SetProxies(const Proxies& proxies) { pimpl_->SetProxies(proxies); }
464 void Session::SetProxies(Proxies&& proxies) { pimpl_->SetProxies(std::move(proxies)); }
465 void Session::SetMultipart(const Multipart& multipart) { pimpl_->SetMultipart(multipart); }
466 void Session::SetMultipart(Multipart&& multipart) { pimpl_->SetMultipart(std::move(multipart)); }
467 void Session::SetRedirect(const bool& redirect) { pimpl_->SetRedirect(redirect); }
468 void Session::SetMaxRedirects(const MaxRedirects& max_redirects) { pimpl_->SetMaxRedirects(max_redirects); }
469 void Session::SetCookies(const Cookies& cookies) { pimpl_->SetCookies(cookies); }
470 void Session::SetBody(const Body& body) { pimpl_->SetBody(body); }
472 void Session::SetLowSpeed(const LowSpeed& low_speed) { pimpl_->SetLowSpeed(low_speed); }
473 void Session::SetVerifySsl(const VerifySsl& verify) { pimpl_->SetVerifySsl(verify); }
474 void Session::SetOption(const Url& url) { pimpl_->SetUrl(url); }
475 void Session::SetOption(const Parameters& parameters) { pimpl_->SetParameters(parameters); }
476 void Session::SetOption(Parameters&& parameters) { pimpl_->SetParameters(std::move(parameters)); }
477 void Session::SetOption(const Header& header) { pimpl_->SetHeader(header); }
478 void Session::SetOption(const Timeout& timeout) { pimpl_->SetTimeout(timeout); }
479 void Session::SetOption(const ConnectTimeout& timeout) { pimpl_->SetConnectTimeout(timeout); }
480 void Session::SetOption(const Authentication& auth) { pimpl_->SetAuth(auth); }
481 void Session::SetOption(const Digest& auth) { pimpl_->SetDigest(auth); }
482 void Session::SetOption(const UserAgent& ua) { pimpl_->SetUserAgent(ua); }
483 void Session::SetOption(const Payload& payload) { pimpl_->SetPayload(payload); }
484 void Session::SetOption(Payload&& payload) { pimpl_->SetPayload(std::move(payload)); }
485 void Session::SetOption(const Proxies& proxies) { pimpl_->SetProxies(proxies); }
486 void Session::SetOption(Proxies&& proxies) { pimpl_->SetProxies(std::move(proxies)); }
487 void Session::SetOption(const Multipart& multipart) { pimpl_->SetMultipart(multipart); }
488 void Session::SetOption(Multipart&& multipart) { pimpl_->SetMultipart(std::move(multipart)); }
489 void Session::SetOption(const bool& redirect) { pimpl_->SetRedirect(redirect); }
490 void Session::SetOption(const MaxRedirects& max_redirects) { pimpl_->SetMaxRedirects(max_redirects); }
491 void Session::SetOption(const Cookies& cookies) { pimpl_->SetCookies(cookies); }
492 void Session::SetOption(const Body& body) { pimpl_->SetBody(body); }
494 void Session::SetOption(const LowSpeed& low_speed) { pimpl_->SetLowSpeed(low_speed); }
495 void Session::SetOption(const VerifySsl& verify) { pimpl_->SetVerifySsl(verify); }
496 void Session::SetOption(const Verbose& verbose) { pimpl_->SetVerbose(verbose); }
497 Response Session::Delete() { return pimpl_->Delete(); }
498 Response Session::Get() { return pimpl_->Get(); }
499 Response Session::Head() { return pimpl_->Head(); }
500 Response Session::Options() { return pimpl_->Options(); }
501 Response Session::Patch() { return pimpl_->Patch(); }
502 Response Session::Post() { return pimpl_->Post(); }
503 Response Session::Put() { return pimpl_->Put(); }
504 // clang-format on
505 
506 } // namespace cpr
Response Post()
Definition: session.cpp:502
void SetCookies(const Cookies &cookies)
Definition: session.cpp:469
std::vector< std::string > split(const std::string &to_split, char delimiter)
Definition: util.cpp:44
CURL_EXTERN curl_version_info_data * curl_version_info(CURLversion)
Definition: version.c:342
void SetAuth(const Authentication &auth)
Definition: session.cpp:458
static void freeHolder(CurlHolder *holder)
Definition: session.cpp:88
void SetParameters(const Parameters &parameters)
Definition: session.cpp:107
void SetVerbose(const Verbose &verbose)
Definition: session.cpp:153
#define CURLAUTH_BASIC
Definition: curl.h:697
std::string GetEncoded() const
Definition: cookies.cpp:10
void SetPayload(Payload &&payload)
Definition: session.cpp:183
std::string Url
Definition: cprtypes.h:14
std::unique_ptr< CurlHolder, std::function< void(CurlHolder *)> > curl_
Definition: session.cpp:51
const char * version
Definition: curl.h:2607
Definition: body.h:13
void SetConnectTimeout(const ConnectTimeout &timeout)
Definition: session.cpp:457
void SetMaxRedirects(const MaxRedirects &max_redirects)
Definition: session.cpp:468
char * data
Definition: curl.h:2336
void SetMultipart(Multipart &&multipart)
Definition: session.cpp:207
::std::string string
Definition: gtest-port.h:1129
void SetRedirect(const bool &redirect)
Definition: session.cpp:467
uv_timer_t timeout
Definition: multi-uv.c:42
Parameters parameters_
Definition: session.cpp:53
static const void * body(MD5_CTX *ctx, const void *data, unsigned long size)
Definition: md5.c:281
std::string content
Definition: payload.h:38
Response Get()
Definition: session.cpp:337
void SetRedirect(const bool &redirect)
Definition: session.cpp:272
curl_error
Definition: tool_cfgable.h:30
Response Head()
Definition: session.cpp:499
const char * GetAuthString() const noexcept
Definition: auth.cpp:5
void SetUrl(const Url &url)
Definition: session.cpp:452
struct curl_slist * chunk
Definition: curlholder.h:12
void SetMultipart(Multipart &&multipart)
Definition: session.cpp:466
static bool verbose
Definition: sockfilt.c:131
#define curl_easy_setopt(handle, option, value)
Definition: typecheck-gcc.h:41
static CurlHolder * newHolder()
Definition: session.cpp:95
void SetConnectTimeout(const ConnectTimeout &timeout)
Definition: session.cpp:146
Response Head()
Definition: session.cpp:347
void SetUserAgent(const UserAgent &ua)
Definition: session.cpp:460
Response Delete()
Definition: session.cpp:326
void SetTimeout(const Timeout &timeout)
Definition: session.cpp:139
CURL_EXTERN void curl_formfree(struct curl_httppost *form)
Definition: formdata.c:800
Response makeRequest(CURL *curl)
Definition: session.cpp:397
void SetPayload(Payload &&payload)
Definition: session.cpp:462
static curl_version_info_data version_info
Definition: version.c:265
Definition: urldata.h:1179
Response Get()
Definition: session.cpp:498
Response Patch()
Definition: session.cpp:501
CURL_EXTERN CURLFORMcode curl_formadd(struct curl_httppost **httppost, struct curl_httppost **last_post,...)
Definition: formdata.c:743
#define curl_easy_getinfo(handle, info, arg)
struct curl_slist * next
Definition: curl.h:2337
CURL_EXTERN struct curl_slist * curl_slist_append(struct curl_slist *, const char *)
Definition: slist.c:89
void SetUrl(const Url &url)
Definition: session.cpp:103
Response Post()
Definition: session.cpp:377
void SetCookies(const Cookies &cookies)
Definition: session.cpp:286
CURL_EXTERN CURL * curl_easy_init(void)
Definition: easy.c:343
void SetTimeout(const Timeout &timeout)
Definition: session.cpp:456
UNITTEST_START struct Curl_easy data
Definition: unit1399.c:82
std::int32_t time
Definition: low_speed.h:13
void SetLowSpeed(const LowSpeed &low_speed)
Definition: session.cpp:310
void SetProxies(Proxies &&proxies)
Definition: session.cpp:464
CURL_EXTERN void curl_easy_cleanup(CURL *curl)
Response Put()
Definition: session.cpp:387
void SetBody(Body &&body)
Definition: session.cpp:471
bool has(const std::string &protocol) const
Definition: proxies.cpp:13
void SetDigest(const Digest &auth)
Definition: session.cpp:168
std::vector< Part > parts
Definition: multipart.h:70
bool verbose
Definition: verbose.h:13
void SetProxies(Proxies &&proxies)
Definition: session.cpp:203
void SetHeader(const Header &header)
Definition: session.cpp:455
Response Options()
Definition: session.cpp:500
Response Put()
Definition: session.cpp:503
Definition: auth.cpp:3
void SetMaxRedirects(const MaxRedirects &max_redirects)
Definition: session.cpp:279
#define CURLVERSION_NOW
Definition: curl.h:2603
void SetUserAgent(const UserAgent &ua)
Definition: session.cpp:176
void CURL
Definition: curl.h:102
struct curl_httppost * formpost
Definition: curlholder.h:13
const char * GetAuthString() const noexcept
Definition: digest.cpp:5
void SetParameters(const Parameters &parameters)
Definition: session.cpp:453
UNITTEST_START int * value
Definition: unit1602.c:51
void SetVerifySsl(const VerifySsl &verify)
Definition: session.cpp:473
Response Options()
Definition: session.cpp:357
Response Patch()
Definition: session.cpp:367
void SetBody(Body &&body)
Definition: session.cpp:294
#define CURLAUTH_DIGEST
Definition: curl.h:698
Proxies proxies_
Definition: session.cpp:54
void SetLowSpeed(const LowSpeed &low_speed)
Definition: session.cpp:472
std::string content
Definition: parameters.h:28
long Milliseconds() const
Definition: timeout.cpp:10
size_t writeFunction(void *ptr, size_t size, size_t nmemb, std::string *data)
Definition: util.cpp:56
Response Delete()
Definition: session.cpp:497
void SetOption(const Url &url)
Definition: session.cpp:474
std::int32_t limit
Definition: low_speed.h:12
std::unique_ptr< Impl > pimpl_
Definition: session.h:92
Header parseHeader(const std::string &headers)
Definition: util.cpp:14
static CURL * curl
Definition: sessioninfo.c:35
CURL_EXTERN void curl_slist_free_all(struct curl_slist *)
Definition: slist.c:129
void SetDigest(const Digest &auth)
Definition: session.cpp:459
std::int32_t number_of_redirects
Definition: max_redirects.h:13
const T & move(const T &t)
Definition: gtest-port.h:1343
CURL_EXTERN CURLcode curl_easy_perform(CURL *curl)
void SetHeader(const Header &header)
Definition: session.cpp:115
void SetVerifySsl(const VerifySsl &verify)
Definition: session.cpp:318
void SetAuth(const Authentication &auth)
Definition: session.cpp:160


rc_tagdetect_client
Author(s): Monika Florek-Jasinska , Raphael Schaller
autogenerated on Sat Feb 13 2021 03:42:16