CernVM-FS  2.11.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
download.h
Go to the documentation of this file.
1 
5 #ifndef CVMFS_NETWORK_DOWNLOAD_H_
6 #define CVMFS_NETWORK_DOWNLOAD_H_
7 
8 #include <poll.h>
9 #include <pthread.h>
10 #include <stdint.h>
11 #include <unistd.h>
12 
13 #include <cstdio>
14 #include <map>
15 #include <set>
16 #include <string>
17 #include <vector>
18 
19 #include "gtest/gtest_prod.h"
20 
21 #include "compression.h"
22 #include "crypto/hash.h"
23 #include "dns.h"
24 #include "duplex_curl.h"
25 #include "sink.h"
26 #include "ssl.h"
27 #include "statistics.h"
28 #include "util/atomic.h"
29 #include "util/pipe.h"
30 #include "util/pointer.h"
31 #include "util/prng.h"
32 
33 class InterruptCue;
34 
35 namespace download {
36 
41 enum Failures {
42  kFailOk = 0,
47  // artificial failure code. Try other host even though
48  // failure seems to be at the proxy
63 
65 }; // Failures
66 
67 
68 inline bool IsHostTransferError(const Failures error) {
69  switch (error) {
71  case kFailHostTooSlow:
73  return true;
74  default:
75  break;
76  }
77  return false;
78 }
79 
80 inline bool IsProxyTransferError(const Failures error) {
81  switch (error) {
83  case kFailProxyTooSlow:
85  return true;
86  default:
87  break;
88  }
89  return false;
90 }
91 
92 inline const char *Code2Ascii(const Failures error) {
93  const char *texts[kFailNumEntries + 1];
94  texts[0] = "OK";
95  texts[1] = "local I/O failure";
96  texts[2] = "malformed URL";
97  texts[3] = "failed to resolve proxy address";
98  texts[4] = "failed to resolve host address";
99  texts[5] = "all proxies failed, trying host fail-over";
100  texts[6] = "proxy connection problem";
101  texts[7] = "host connection problem";
102  texts[8] = "proxy returned HTTP error";
103  texts[9] = "host returned HTTP error";
104  texts[10] = "corrupted data received";
105  texts[11] = "resource too big to download";
106  texts[12] = "unknown network error";
107  texts[13] = "Unsupported URL in protocol";
108  texts[14] = "proxy serving data too slowly";
109  texts[15] = "host serving data too slowly";
110  texts[16] = "proxy data transfer cut short";
111  texts[17] = "host data transfer cut short";
112  texts[18] = "request canceled";
113  texts[19] = "no text";
114  return texts[error];
115 }
116 
126 }; // Destination
127 
128 
129 struct Counters {
131  perf::Counter *sz_transfer_time; // measured in milliseconds
136 
137  explicit Counters(perf::StatisticsTemplate statistics) {
138  sz_transferred_bytes = statistics.RegisterTemplated("sz_transferred_bytes",
139  "Number of transferred bytes");
140  sz_transfer_time = statistics.RegisterTemplated("sz_transfer_time",
141  "Transfer time (milliseconds)");
142  n_requests = statistics.RegisterTemplated("n_requests",
143  "Number of requests");
144  n_retries = statistics.RegisterTemplated("n_retries", "Number of retries");
145  n_proxy_failover = statistics.RegisterTemplated("n_proxy_failover",
146  "Number of proxy failovers");
147  n_host_failover = statistics.RegisterTemplated("n_host_failover",
148  "Number of host failovers");
149  }
150 }; // Counters
151 
152 
156 struct JobInfo {
157  const std::string *url;
163  pid_t pid;
164  uid_t uid;
165  gid_t gid;
166  void *cred_data; // Per-transfer credential data
169  struct {
170  size_t size;
171  size_t pos;
172  char *data;
173  } destination_mem;
175  const std::string *destination_path;
178  const std::string *extra_info;
179 
180  // Allow byte ranges to be specified.
182  off_t range_size;
183 
184  // Default initialization of fields
185  void Init() {
186  url = NULL;
187  compressed = false;
188  probe_hosts = false;
189  head_request = false;
190  follow_redirects = false;
191  force_nocache = false;
192  pid = -1;
193  uid = -1;
194  gid = -1;
195  cred_data = NULL;
196  interrupt_cue = NULL;
198  destination_mem.size = destination_mem.pos = 0;
199  destination_mem.data = NULL;
200  destination_file = NULL;
201  destination_path = NULL;
202  destination_sink = NULL;
203  expected_hash = NULL;
204  extra_info = NULL;
205 
206  curl_handle = NULL;
207  headers = NULL;
208  memset(&zstream, 0, sizeof(zstream));
209  info_header = NULL;
210  pipe_job_results = NULL;
211  nocache = false;
214  backoff_ms = 0;
216 
217  range_offset = -1;
218  range_size = -1;
219  http_code = -1;
220  }
221 
222  // One constructor per destination + head request
223  JobInfo() { Init(); }
224  JobInfo(const std::string *u, const bool c, const bool ph,
225  const std::string *p, const shash::Any *h)
226  {
227  Init();
228  url = u;
229  compressed = c;
230  probe_hosts = ph;
232  destination_path = p;
233  expected_hash = h;
234  }
235  JobInfo(const std::string *u, const bool c, const bool ph, FILE *f,
236  const shash::Any *h)
237  {
238  Init();
239  url = u;
240  compressed = c;
241  probe_hosts = ph;
243  destination_file = f;
244  expected_hash = h;
245  }
246  JobInfo(const std::string *u, const bool c, const bool ph,
247  const shash::Any *h)
248  {
249  Init();
250  url = u;
251  compressed = c;
252  probe_hosts = ph;
254  expected_hash = h;
255  }
256  JobInfo(const std::string *u, const bool c, const bool ph,
257  cvmfs::Sink *s, const shash::Any *h)
258  {
259  Init();
260  url = u;
261  compressed = c;
262  probe_hosts = ph;
264  destination_sink = s;
265  expected_hash = h;
266  }
267  JobInfo(const std::string *u, const bool ph) {
268  Init();
269  url = u;
270  probe_hosts = ph;
271  head_request = true;
272  }
273 
275  if (pipe_job_results.IsValid()) {
277  }
278  }
279 
284  bool IsFileNotFound();
285 
286  // Internal state, don't touch
287  CURL *curl_handle;
288  curl_slist *headers;
289  char *info_header;
290  z_stream zstream;
292 
295 
296  std::string proxy;
297  bool nocache;
300  unsigned char num_used_proxies;
301  unsigned char num_used_hosts;
302  unsigned char num_retries;
303  unsigned backoff_ms;
305 }; // JobInfo
306 
307 
317 class HeaderLists {
318  FRIEND_TEST(T_HeaderLists, Intrinsics);
319  public:
320  ~HeaderLists();
321  curl_slist *GetList(const char *header);
322  curl_slist *DuplicateList(curl_slist *slist);
323  void AppendHeader(curl_slist *slist, const char *header);
324  void CutHeader(const char *header, curl_slist **slist);
325  void PutList(curl_slist *slist);
326  std::string Print(curl_slist *slist);
327 
328  private:
329  static const unsigned kBlockSize = 4096/sizeof(curl_slist);
330 
331  bool IsUsed(curl_slist *slist) { return slist->data != NULL; }
332  curl_slist *Get(const char *header);
333  void Put(curl_slist *slist);
334  void AddBlock();
335 
336  std::vector<curl_slist *> blocks_; // List of curl_slist blocks
337 };
338 
339 
346  public:
348  virtual bool ConfigureCurlHandle(CURL *curl_handle,
349  pid_t pid,
350  void **info_data) = 0;
351  virtual void ReleaseCurlHandle(CURL *curl_handle, void *info_data) = 0;
352 };
353 
354 
359 class DownloadManager { // NOLINT(clang-analyzer-optin.performance.Padding)
360  FRIEND_TEST(T_Download, ValidateGeoReply);
361  FRIEND_TEST(T_Download, StripDirect);
362 
363  public:
364  struct ProxyInfo {
365  ProxyInfo() { }
366  explicit ProxyInfo(const std::string &url) : url(url) { }
367  ProxyInfo(const dns::Host &host, const std::string &url)
368  : host(host)
369  , url(url)
370  { }
371  std::string Print();
373  std::string url;
374  };
375 
380  };
381 
385  static const int kProbeUnprobed;
390  static const int kProbeDown;
394  static const int kProbeGeo;
395 
399  static const unsigned kMaxMemSize;
400 
401  static const unsigned kDnsDefaultRetries = 1;
402  static const unsigned kDnsDefaultTimeoutMs = 3000;
403  static const unsigned kProxyMapScale = 16;
404 
405  DownloadManager();
407 
408  static int ParseHttpCode(const char digits[3]);
409 
410  void Init(const unsigned max_pool_handles,
411  const perf::StatisticsTemplate &statistics);
412  void Fini();
413  void Spawn();
414  DownloadManager *Clone(const perf::StatisticsTemplate &statistics);
415  Failures Fetch(JobInfo *info);
416 
418  std::string GetDnsServer() const;
419  void SetDnsServer(const std::string &address);
420  void SetDnsParameters(const unsigned retries, const unsigned timeout_ms);
421  void SetDnsTtlLimits(const unsigned min_seconds, const unsigned max_seconds);
422  void SetIpPreference(const dns::IpPreference preference);
423  void SetTimeout(const unsigned seconds_proxy, const unsigned seconds_direct);
424  void GetTimeout(unsigned *seconds_proxy, unsigned *seconds_direct);
425  void SetLowSpeedLimit(const unsigned low_speed_limit);
426  void SetHostChain(const std::string &host_list);
427  void SetHostChain(const std::vector<std::string> &host_list);
428  void GetHostInfo(std::vector<std::string> *host_chain,
429  std::vector<int> *rtt, unsigned *current_host);
430  void ProbeHosts();
431  bool ProbeGeo();
432  // Sort list of servers using the Geo API. If the output_order
433  // vector is NULL, then the servers vector input is itself sorted.
434  // If it is non-NULL, then servers is left unchanged and the zero-based
435  // ordering is stored into output_order.
436  bool GeoSortServers(std::vector<std::string> *servers,
437  std::vector<uint64_t> *output_order = NULL);
438  void SwitchHost();
439  void SetProxyChain(const std::string &proxy_list,
440  const std::string &fallback_proxy_list,
441  const ProxySetModes set_mode);
442  void GetProxyInfo(std::vector< std::vector<ProxyInfo> > *proxy_chain,
443  unsigned *current_group,
444  unsigned *fallback_group);
445  std::string GetProxyList();
446  std::string GetFallbackProxyList();
447  void ShardProxies();
448  void RebalanceProxies();
449  void SwitchProxyGroup();
450  void SetProxyGroupResetDelay(const unsigned seconds);
451  void SetHostResetDelay(const unsigned seconds);
452  void SetRetryParameters(const unsigned max_retries,
453  const unsigned backoff_init_ms,
454  const unsigned backoff_max_ms);
455  void SetMaxIpaddrPerProxy(unsigned limit);
456  void SetProxyTemplates(const std::string &direct, const std::string &forced);
457  void EnableInfoHeader();
458  void EnableRedirects();
460 
461  unsigned num_hosts() {
462  if (opt_host_chain_) return opt_host_chain_->size();
463  return 0;
464  }
465 
467  return opt_ip_preference_;
468  }
469 
470  private:
471  static int CallbackCurlSocket(CURL *easy, curl_socket_t s, int action,
472  void *userp, void *socketp);
473  static void *MainDownload(void *data);
474 
475  bool StripDirect(const std::string &proxy_list, std::string *cleaned_list);
476  bool ValidateGeoReply(const std::string &reply_order,
477  const unsigned expected_size,
478  std::vector<uint64_t> *reply_vals);
479  void SwitchHost(JobInfo *info);
480  void SwitchProxy(JobInfo *info);
481  ProxyInfo *ChooseProxyUnlocked(const shash::Any *hash);
482  void UpdateProxiesUnlocked(const std::string &reason);
483  void RebalanceProxiesUnlocked(const std::string &reason);
484  CURL *AcquireCurlHandle();
485  void ReleaseCurlHandle(CURL *handle);
486  void ReleaseCredential(JobInfo *info);
487  void InitializeRequest(JobInfo *info, CURL *handle);
488  void SetUrlOptions(JobInfo *info);
489  bool ValidateProxyIpsUnlocked(const std::string &url, const dns::Host &host);
490  void UpdateStatistics(CURL *handle);
491  bool CanRetry(const JobInfo *info);
492  void Backoff(JobInfo *info);
493  void SetNocache(JobInfo *info);
494  void SetRegularCache(JobInfo *info);
495  bool VerifyAndFinalize(const int curl_error, JobInfo *info);
496  void InitHeaders();
497  void FiniHeaders();
498  void CloneProxyConfig(DownloadManager *clone);
499 
500  inline std::vector<ProxyInfo> *current_proxy_group() const {
501  return (opt_proxy_groups_ ?
503  }
504 
506  std::set<CURL *> *pool_handles_idle_;
507  std::set<CURL *> *pool_handles_inuse_;
509  CURLM *curl_multi_;
511  curl_slist *default_headers_;
512  char *user_agent_;
513 
514  pthread_t thread_download_;
517 
519  struct pollfd *watch_fds_;
520  uint32_t watch_fds_size_;
522  uint32_t watch_fds_max_;
523 
524  pthread_mutex_t *lock_options_;
525  pthread_mutex_t *lock_synchronous_mode_;
526  std::string opt_dns_server_;
536 
537  // Host list
538  std::vector<std::string> *opt_host_chain_;
543  std::vector<int> *opt_host_chain_rtt_;
545 
546  // Proxy list
547  std::vector< std::vector<ProxyInfo> > *opt_proxy_groups_;
569  std::string opt_proxy_list_;
577  std::map<uint32_t, ProxyInfo *> opt_proxy_map_;
581  std::vector<std::string> opt_proxy_urls_;
586 
591 
596 
609 
617  time_t opt_timestamp_failover_proxies_; // failover within the same group
619 
627 
629 
635 
640 }; // DownloadManager
641 
642 } // namespace download
643 
644 #endif // CVMFS_NETWORK_DOWNLOAD_H_
unsigned opt_timeout_direct_
Definition: download.h:528
bool StripDirect(const std::string &proxy_list, std::string *cleaned_list)
Definition: download.cc:2385
unsigned opt_low_speed_limit_
Definition: download.h:529
Destination destination
Definition: download.h:168
Definition: prng.h:28
static const unsigned kDnsDefaultTimeoutMs
Definition: download.h:402
unsigned opt_backoff_init_ms_
Definition: download.h:531
unsigned char num_used_hosts
Definition: download.h:301
curl_slist * Get(const char *header)
Definition: download.cc:740
std::string Print(curl_slist *slist)
Definition: download.cc:730
unsigned opt_proxy_groups_current_burned_
Definition: download.h:556
unsigned opt_proxy_groups_reset_after_
Definition: download.h:618
void SetUrlOptions(JobInfo *info)
Definition: download.cc:912
void ReleaseCredential(JobInfo *info)
Definition: download.cc:1219
unsigned backoff_ms
Definition: download.h:303
bool IsUsed(curl_slist *slist)
Definition: download.h:331
std::string opt_proxy_fallback_list_
Definition: download.h:573
void SetHostChain(const std::string &host_list)
void SetNocache(JobInfo *info)
Definition: download.cc:1192
unsigned opt_host_reset_after_
Definition: download.h:626
void SetLowSpeedLimit(const unsigned low_speed_limit)
Definition: download.cc:1905
std::string proxy_template_direct_
Definition: download.h:602
static int ParseHttpCode(const char digits[3])
Definition: download.cc:405
FRIEND_TEST(T_Download, ValidateGeoReply)
static const int kProbeGeo
Definition: download.h:394
static const unsigned kBlockSize
Definition: download.h:329
unsigned opt_proxy_groups_current_
Definition: download.h:551
off_t range_offset
Definition: download.h:181
shash::ContextPtr hash_context
Definition: download.h:291
bool ValidateGeoReply(const std::string &reply_order, const unsigned expected_size, std::vector< uint64_t > *reply_vals)
Definition: download.cc:2345
std::vector< ProxyInfo > * current_proxy_group() const
Definition: download.h:500
bool IsFileNotFound()
Definition: download.cc:385
time_t opt_timestamp_backup_proxies_
Definition: download.h:616
void SetProxyChain(const std::string &proxy_list, const std::string &fallback_proxy_list, const ProxySetModes set_mode)
Definition: download.cc:2425
std::string GetProxyList()
Definition: download.cc:2599
unsigned int current_host_chain_index
Definition: download.h:304
std::set< CURL * > * pool_handles_inuse_
Definition: download.h:507
void * cred_data
Definition: download.h:166
pthread_mutex_t * lock_options_
Definition: download.h:524
ProxyInfo * ChooseProxyUnlocked(const shash::Any *hash)
Definition: download.cc:2611
pthread_t thread_download_
Definition: download.h:514
ProxyInfo(const dns::Host &host, const std::string &url)
Definition: download.h:367
std::string opt_proxy_list_
Definition: download.h:569
perf::Counter * sz_transfer_time
Definition: download.h:131
std::vector< std::vector< ProxyInfo > > * opt_proxy_groups_
Definition: download.h:547
unsigned opt_proxy_groups_fallback_
Definition: download.h:561
curl_slist * default_headers_
Definition: download.h:511
curl_slist * GetList(const char *header)
Definition: download.cc:664
void ReleaseCurlHandle(CURL *handle)
Definition: download.cc:826
z_stream zstream
Definition: download.h:290
void SetDnsServer(const std::string &address)
Definition: download.cc:1834
JobInfo(const std::string *u, const bool c, const bool ph, const shash::Any *h)
Definition: download.h:246
FRIEND_TEST(T_HeaderLists, Intrinsics)
static void * MainDownload(void *data)
Definition: download.cc:501
void SetTimeout(const unsigned seconds_proxy, const unsigned seconds_direct)
Definition: download.cc:1891
perf::Counter * n_retries
Definition: download.h:133
std::string opt_dns_server_
Definition: download.h:526
void Backoff(JobInfo *info)
Definition: download.cc:1170
perf::Counter * sz_transferred_bytes
Definition: download.h:130
int32_t atomic_int32
Definition: atomic.h:17
Counter * RegisterTemplated(const std::string &name_minor, const std::string &desc)
Definition: statistics.h:111
void UpdateStatistics(CURL *handle)
Definition: download.cc:1136
void SetDnsTtlLimits(const unsigned min_seconds, const unsigned max_seconds)
Definition: download.cc:1870
void Init(const unsigned max_pool_handles, const perf::StatisticsTemplate &statistics)
Definition: download.cc:1621
std::vector< std::string > opt_proxy_urls_
Definition: download.h:581
const char * Code2Ascii(const Failures error)
Definition: download.h:92
unsigned char num_retries
Definition: download.h:302
void GetProxyInfo(std::vector< std::vector< ProxyInfo > > *proxy_chain, unsigned *current_group, unsigned *fallback_group)
Definition: download.cc:2574
void SetProxyGroupResetDelay(const unsigned seconds)
Definition: download.cc:2722
atomic_int32 multi_threaded_
Definition: download.h:515
dns::NormalResolver * resolver_
Definition: download.h:590
std::vector< curl_slist * > blocks_
Definition: download.h:336
ProxyInfo(const std::string &url)
Definition: download.h:366
dns::IpPreference opt_ip_preference_
Definition: download.h:595
Definition: dns.h:90
perf::Counter * n_host_failover
Definition: download.h:135
void UpdateProxiesUnlocked(const std::string &reason)
Definition: download.cc:2625
bool IsProxyTransferError(const Failures error)
Definition: download.h:80
FILE * destination_file
Definition: download.h:174
void AppendHeader(curl_slist *slist, const char *header)
Definition: download.cc:686
bool follow_redirects
Definition: download.h:161
void SetIpPreference(const dns::IpPreference preference)
Definition: download.cc:1880
perf::Counter * n_requests
Definition: download.h:132
JobInfo(const std::string *u, const bool c, const bool ph, const std::string *p, const shash::Any *h)
Definition: download.h:224
void SetRetryParameters(const unsigned max_retries, const unsigned backoff_init_ms, const unsigned backoff_max_ms)
Definition: download.cc:2741
void SetRegularCache(JobInfo *info)
Definition: download.cc:1206
void CloneProxyConfig(DownloadManager *clone)
Definition: download.cc:2822
void PutList(curl_slist *slist)
Definition: download.cc:721
bool IsValid() const
Definition: pointer.h:43
void SetMaxIpaddrPerProxy(unsigned limit)
Definition: download.cc:2752
DownloadManager * Clone(const perf::StatisticsTemplate &statistics)
Definition: download.cc:2785
const shash::Any * expected_hash
Definition: download.h:177
const std::string * extra_info
Definition: download.h:178
std::vector< int > * opt_host_chain_rtt_
Definition: download.h:543
dns::IpPreference opt_ip_preference() const
Definition: download.h:466
cvmfs::Sink * destination_sink
Definition: download.h:176
SslCertificateStore ssl_certificate_store_
Definition: download.h:639
time_t opt_timestamp_backup_host_
Definition: download.h:625
std::string GetFallbackProxyList()
Definition: download.cc:2603
void SetProxyTemplates(const std::string &direct, const std::string &forced)
Definition: download.cc:2758
IpPreference
Definition: dns.h:46
unsigned opt_backoff_max_ms_
Definition: download.h:532
std::string GetDnsServer() const
Definition: download.cc:1826
unsigned opt_host_chain_current_
Definition: download.h:544
CURL * curl_handle
Definition: download.h:287
CredentialsAttachment * credentials_attachment_
Definition: download.h:628
std::vector< std::string > * opt_host_chain_
Definition: download.h:538
struct pollfd * watch_fds_
Definition: download.h:519
std::map< uint32_t, ProxyInfo * > opt_proxy_map_
Definition: download.h:577
curl_slist * DuplicateList(curl_slist *slist)
Definition: download.cc:669
Failures error_code
Definition: download.h:298
JobInfo(const std::string *u, const bool ph)
Definition: download.h:267
UniquePtr< Pipe< kPipeDownloadJobs > > pipe_jobs_
Definition: download.h:518
Failures Fetch(JobInfo *info)
Definition: download.cc:1734
InterruptCue * interrupt_cue
Definition: download.h:167
bool CanRetry(const JobInfo *info)
Definition: download.cc:1154
perf::Counter * n_proxy_failover
Definition: download.h:134
JobInfo(const std::string *u, const bool c, const bool ph, FILE *f, const shash::Any *h)
Definition: download.h:235
void GetTimeout(unsigned *seconds_proxy, unsigned *seconds_direct)
Definition: download.cc:1914
std::string proxy_template_forced_
Definition: download.h:608
const std::string * destination_path
Definition: download.h:175
time_t opt_timestamp_failover_proxies_
Definition: download.h:617
void SetDnsParameters(const unsigned retries, const unsigned timeout_ms)
Definition: download.cc:1852
struct download::JobInfo::@4 destination_mem
UniquePtr< Pipe< kPipeThreadTerminator > > pipe_terminate_
Definition: download.h:516
static const int kProbeUnprobed
Definition: download.h:385
virtual void ReleaseCurlHandle(CURL *curl_handle, void *info_data)=0
static const unsigned kMaxMemSize
Definition: download.h:399
bool IsHostTransferError(const Failures error)
Definition: download.h:68
JobInfo(const std::string *u, const bool c, const bool ph, cvmfs::Sink *s, const shash::Any *h)
Definition: download.h:256
static const unsigned kDnsDefaultRetries
Definition: download.h:401
bool GeoSortServers(std::vector< std::string > *servers, std::vector< uint64_t > *output_order=NULL)
Definition: download.cc:2144
static const int kProbeDown
Definition: download.h:390
curl_slist * headers
Definition: download.h:288
UniquePtr< Pipe< kPipeDownloadJobsResults > > pipe_job_results
Pipe used for the return value.
Definition: download.h:294
unsigned char num_used_proxies
Definition: download.h:300
Counters(perf::StatisticsTemplate statistics)
Definition: download.h:137
std::string proxy
Definition: download.h:296
static const unsigned kProxyMapScale
Definition: download.h:403
void GetHostInfo(std::vector< std::string > *host_chain, std::vector< int > *rtt, unsigned *current_host)
Definition: download.cc:1958
bool ValidateProxyIpsUnlocked(const std::string &url, const dns::Host &host)
Definition: download.cc:1072
bool VerifyAndFinalize(const int curl_error, JobInfo *info)
Definition: download.cc:1235
void CutHeader(const char *header, curl_slist **slist)
Definition: download.cc:702
const std::string * url
Definition: download.h:157
void SwitchProxy(JobInfo *info)
Definition: download.cc:1978
void SetCredentialsAttachment(CredentialsAttachment *ca)
Definition: download.cc:1818
std::set< CURL * > * pool_handles_idle_
Definition: download.h:506
void RebalanceProxiesUnlocked(const std::string &reason)
Definition: download.cc:2689
pthread_mutex_t * lock_synchronous_mode_
Definition: download.h:525
virtual bool ConfigureCurlHandle(CURL *curl_handle, pid_t pid, void **info_data)=0
void Destroy()
Definition: pointer.h:45
void InitializeRequest(JobInfo *info, CURL *handle)
Definition: download.cc:844
static int CallbackCurlSocket(CURL *easy, curl_socket_t s, int action, void *userp, void *socketp)
Definition: download.cc:421
HeaderLists * header_lists_
Definition: download.h:510
void SetHostResetDelay(const unsigned seconds)
Definition: download.cc:2732
void Put(curl_slist *slist)
Definition: download.cc:757
char * info_header
Definition: download.h:289