CernVM-FS  2.10.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_DOWNLOAD_H_
6 #define CVMFS_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 "atomic.h"
22 #include "compression.h"
23 #include "dns.h"
24 #include "duplex_curl.h"
25 #include "hash.h"
26 #include "prng.h"
27 #include "sink.h"
28 #include "ssl.h"
29 #include "statistics.h"
30 
31 
32 namespace download {
33 
38 enum Failures {
39  kFailOk = 0,
44  // artificial failure code. Try other host even though
45  // failure seems to be at the proxy
59 
61 }; // Failures
62 
63 
64 inline bool IsHostTransferError(const Failures error) {
65  switch (error) {
67  case kFailHostTooSlow:
69  return true;
70  default:
71  break;
72  }
73  return false;
74 }
75 
76 inline bool IsProxyTransferError(const Failures error) {
77  switch (error) {
79  case kFailProxyTooSlow:
81  return true;
82  default:
83  break;
84  }
85  return false;
86 }
87 
88 inline const char *Code2Ascii(const Failures error) {
89  const char *texts[kFailNumEntries + 1];
90  texts[0] = "OK";
91  texts[1] = "local I/O failure";
92  texts[2] = "malformed URL";
93  texts[3] = "failed to resolve proxy address";
94  texts[4] = "failed to resolve host address";
95  texts[5] = "all proxies failed, trying host fail-over";
96  texts[6] = "proxy connection problem";
97  texts[7] = "host connection problem";
98  texts[8] = "proxy returned HTTP error";
99  texts[9] = "host returned HTTP error";
100  texts[10] = "corrupted data received";
101  texts[11] = "resource too big to download";
102  texts[12] = "unknown network error";
103  texts[13] = "Unsupported URL in protocol";
104  texts[14] = "proxy serving data too slowly";
105  texts[15] = "host serving data too slowly";
106  texts[16] = "proxy data transfer cut short";
107  texts[17] = "host data transfer cut short";
108  texts[18] = "no text";
109  return texts[error];
110 }
111 
121 }; // Destination
122 
123 
124 struct Counters {
126  perf::Counter *sz_transfer_time; // measured in miliseconds
131 
132  explicit Counters(perf::StatisticsTemplate statistics) {
133  sz_transferred_bytes = statistics.RegisterTemplated("sz_transferred_bytes",
134  "Number of transferred bytes");
135  sz_transfer_time = statistics.RegisterTemplated("sz_transfer_time",
136  "Transfer time (miliseconds)");
137  n_requests = statistics.RegisterTemplated("n_requests",
138  "Number of requests");
139  n_retries = statistics.RegisterTemplated("n_retries", "Number of retries");
140  n_proxy_failover = statistics.RegisterTemplated("n_proxy_failover",
141  "Number of proxy failovers");
142  n_host_failover = statistics.RegisterTemplated("n_host_failover",
143  "Number of host failovers");
144  }
145 }; // Counters
146 
147 
151 struct JobInfo {
152  const std::string *url;
158  pid_t pid;
159  uid_t uid;
160  gid_t gid;
161  void *cred_data; // Per-transfer credential data
163  struct {
164  size_t size;
165  size_t pos;
166  char *data;
167  } destination_mem;
169  const std::string *destination_path;
172  const std::string *extra_info;
173 
174  // Allow byte ranges to be specified.
176  off_t range_size;
177 
178  // Default initialization of fields
179  void Init() {
180  url = NULL;
181  compressed = false;
182  probe_hosts = false;
183  head_request = false;
184  follow_redirects = false;
185  force_nocache = false;
186  pid = -1;
187  uid = -1;
188  gid = -1;
189  cred_data = NULL;
191  destination_mem.size = destination_mem.pos = 0;
192  destination_mem.data = NULL;
193  destination_file = NULL;
194  destination_path = NULL;
195  destination_sink = NULL;
196  expected_hash = NULL;
197  extra_info = NULL;
198 
199  curl_handle = NULL;
200  headers = NULL;
201  memset(&zstream, 0, sizeof(zstream));
202  info_header = NULL;
203  wait_at[0] = wait_at[1] = -1;
204  nocache = false;
207  backoff_ms = 0;
209 
210  range_offset = -1;
211  range_size = -1;
212  http_code = -1;
213  }
214 
215  // One constructor per destination + head request
216  JobInfo() { Init(); }
217  JobInfo(const std::string *u, const bool c, const bool ph,
218  const std::string *p, const shash::Any *h)
219  {
220  Init();
221  url = u;
222  compressed = c;
223  probe_hosts = ph;
225  destination_path = p;
226  expected_hash = h;
227  }
228  JobInfo(const std::string *u, const bool c, const bool ph, FILE *f,
229  const shash::Any *h)
230  {
231  Init();
232  url = u;
233  compressed = c;
234  probe_hosts = ph;
236  destination_file = f;
237  expected_hash = h;
238  }
239  JobInfo(const std::string *u, const bool c, const bool ph,
240  const shash::Any *h)
241  {
242  Init();
243  url = u;
244  compressed = c;
245  probe_hosts = ph;
247  expected_hash = h;
248  }
249  JobInfo(const std::string *u, const bool c, const bool ph,
250  cvmfs::Sink *s, const shash::Any *h)
251  {
252  Init();
253  url = u;
254  compressed = c;
255  probe_hosts = ph;
257  destination_sink = s;
258  expected_hash = h;
259  }
260  JobInfo(const std::string *u, const bool ph) {
261  Init();
262  url = u;
263  probe_hosts = ph;
264  head_request = true;
265  }
266 
268  if (wait_at[0] >= 0) {
269  close(wait_at[0]);
270  close(wait_at[1]);
271  }
272  }
273 
278  bool IsFileNotFound();
279 
280  // Internal state, don't touch
281  CURL *curl_handle;
282  curl_slist *headers;
283  char *info_header;
284  z_stream zstream;
286  int wait_at[2];
287  std::string proxy;
288  bool nocache;
291  unsigned char num_used_proxies;
292  unsigned char num_used_hosts;
293  unsigned char num_retries;
294  unsigned backoff_ms;
296 }; // JobInfo
297 
298 
308 class HeaderLists {
309  FRIEND_TEST(T_HeaderLists, Intrinsics);
310  public:
311  ~HeaderLists();
312  curl_slist *GetList(const char *header);
313  curl_slist *DuplicateList(curl_slist *slist);
314  void AppendHeader(curl_slist *slist, const char *header);
315  void CutHeader(const char *header, curl_slist **slist);
316  void PutList(curl_slist *slist);
317  std::string Print(curl_slist *slist);
318 
319  private:
320  static const unsigned kBlockSize = 4096/sizeof(curl_slist);
321 
322  bool IsUsed(curl_slist *slist) { return slist->data != NULL; }
323  curl_slist *Get(const char *header);
324  void Put(curl_slist *slist);
325  void AddBlock();
326 
327  std::vector<curl_slist *> blocks_; // List of curl_slist blocks
328 };
329 
330 
337  public:
339  virtual bool ConfigureCurlHandle(CURL *curl_handle,
340  pid_t pid,
341  void **info_data) = 0;
342  virtual void ReleaseCurlHandle(CURL *curl_handle, void *info_data) = 0;
343 };
344 
345 
350 class DownloadManager { // NOLINT(clang-analyzer-optin.performance.Padding)
351  FRIEND_TEST(T_Download, ValidateGeoReply);
352  FRIEND_TEST(T_Download, StripDirect);
353 
354  public:
355  struct ProxyInfo {
356  ProxyInfo() { }
357  explicit ProxyInfo(const std::string &url) : url(url) { }
358  ProxyInfo(const dns::Host &host, const std::string &url)
359  : host(host)
360  , url(url)
361  { }
362  std::string Print();
364  std::string url;
365  };
366 
371  };
372 
376  static const int kProbeUnprobed;
381  static const int kProbeDown;
385  static const int kProbeGeo;
386 
390  static const unsigned kMaxMemSize;
391 
392  static const unsigned kDnsDefaultRetries = 1;
393  static const unsigned kDnsDefaultTimeoutMs = 3000;
394  static const unsigned kProxyMapScale = 16;
395 
396  DownloadManager();
398 
399  static int ParseHttpCode(const char digits[3]);
400 
401  void Init(const unsigned max_pool_handles,
402  const perf::StatisticsTemplate &statistics);
403  void Fini();
404  void Spawn();
405  DownloadManager *Clone(const perf::StatisticsTemplate &statistics);
406  Failures Fetch(JobInfo *info);
407 
409  std::string GetDnsServer() const;
410  void SetDnsServer(const std::string &address);
411  void SetDnsParameters(const unsigned retries, const unsigned timeout_ms);
412  void SetDnsTtlLimits(const unsigned min_seconds, const unsigned max_seconds);
413  void SetIpPreference(const dns::IpPreference preference);
414  void SetTimeout(const unsigned seconds_proxy, const unsigned seconds_direct);
415  void GetTimeout(unsigned *seconds_proxy, unsigned *seconds_direct);
416  void SetLowSpeedLimit(const unsigned low_speed_limit);
417  void SetHostChain(const std::string &host_list);
418  void SetHostChain(const std::vector<std::string> &host_list);
419  void GetHostInfo(std::vector<std::string> *host_chain,
420  std::vector<int> *rtt, unsigned *current_host);
421  void ProbeHosts();
422  bool ProbeGeo();
423  // Sort list of servers using the Geo API. If the output_order
424  // vector is NULL, then the servers vector input is itself sorted.
425  // If it is non-NULL, then servers is left unchanged and the zero-based
426  // ordering is stored into output_order.
427  bool GeoSortServers(std::vector<std::string> *servers,
428  std::vector<uint64_t> *output_order = NULL);
429  void SwitchHost();
430  void SetProxyChain(const std::string &proxy_list,
431  const std::string &fallback_proxy_list,
432  const ProxySetModes set_mode);
433  void GetProxyInfo(std::vector< std::vector<ProxyInfo> > *proxy_chain,
434  unsigned *current_group,
435  unsigned *fallback_group);
436  std::string GetProxyList();
437  std::string GetFallbackProxyList();
438  void ShardProxies();
439  void RebalanceProxies();
440  void SwitchProxyGroup();
441  void SetProxyGroupResetDelay(const unsigned seconds);
442  void SetHostResetDelay(const unsigned seconds);
443  void SetRetryParameters(const unsigned max_retries,
444  const unsigned backoff_init_ms,
445  const unsigned backoff_max_ms);
446  void SetMaxIpaddrPerProxy(unsigned limit);
447  void SetProxyTemplates(const std::string &direct, const std::string &forced);
448  void EnableInfoHeader();
449  void EnableRedirects();
451 
452  unsigned num_hosts() {
453  if (opt_host_chain_) return opt_host_chain_->size();
454  return 0;
455  }
456 
458  return opt_ip_preference_;
459  }
460 
461  private:
462  static int CallbackCurlSocket(CURL *easy, curl_socket_t s, int action,
463  void *userp, void *socketp);
464  static void *MainDownload(void *data);
465 
466  bool StripDirect(const std::string &proxy_list, std::string *cleaned_list);
467  bool ValidateGeoReply(const std::string &reply_order,
468  const unsigned expected_size,
469  std::vector<uint64_t> *reply_vals);
470  void SwitchHost(JobInfo *info);
471  void SwitchProxy(JobInfo *info);
472  ProxyInfo *ChooseProxyUnlocked(const shash::Any *hash);
473  void UpdateProxiesUnlocked(const std::string &reason);
474  void RebalanceProxiesUnlocked(const std::string &reason);
475  CURL *AcquireCurlHandle();
476  void ReleaseCurlHandle(CURL *handle);
477  void ReleaseCredential(JobInfo *info);
478  void InitializeRequest(JobInfo *info, CURL *handle);
479  void SetUrlOptions(JobInfo *info);
480  bool ValidateProxyIpsUnlocked(const std::string &url, const dns::Host &host);
481  void UpdateStatistics(CURL *handle);
482  bool CanRetry(const JobInfo *info);
483  void Backoff(JobInfo *info);
484  void SetNocache(JobInfo *info);
485  void SetRegularCache(JobInfo *info);
486  bool VerifyAndFinalize(const int curl_error, JobInfo *info);
487  void InitHeaders();
488  void FiniHeaders();
489  void CloneProxyConfig(DownloadManager *clone);
490 
491  inline std::vector<ProxyInfo> *current_proxy_group() const {
492  return (opt_proxy_groups_ ?
494  }
495 
497  std::set<CURL *> *pool_handles_idle_;
498  std::set<CURL *> *pool_handles_inuse_;
500  CURLM *curl_multi_;
502  curl_slist *default_headers_;
503  char *user_agent_;
504 
505  pthread_t thread_download_;
508 
509  int pipe_jobs_[2];
510  struct pollfd *watch_fds_;
511  uint32_t watch_fds_size_;
513  uint32_t watch_fds_max_;
514 
515  pthread_mutex_t *lock_options_;
516  pthread_mutex_t *lock_synchronous_mode_;
517  std::string opt_dns_server_;
527 
528  // Host list
529  std::vector<std::string> *opt_host_chain_;
534  std::vector<int> *opt_host_chain_rtt_;
536 
537  // Proxy list
538  std::vector< std::vector<ProxyInfo> > *opt_proxy_groups_;
560  std::string opt_proxy_list_;
568  std::map<uint32_t, ProxyInfo *> opt_proxy_map_;
572  std::vector<std::string> opt_proxy_urls_;
577 
582 
587 
600 
608  time_t opt_timestamp_failover_proxies_; // failover within the same group
610 
618 
620 
626 
631 }; // DownloadManager
632 
633 } // namespace download
634 
635 #endif // CVMFS_DOWNLOAD_H_
unsigned opt_timeout_direct_
Definition: download.h:519
bool StripDirect(const std::string &proxy_list, std::string *cleaned_list)
Definition: download.cc:2367
unsigned opt_low_speed_limit_
Definition: download.h:520
Destination destination
Definition: download.h:162
Definition: prng.h:25
static const unsigned kDnsDefaultTimeoutMs
Definition: download.h:393
unsigned opt_backoff_init_ms_
Definition: download.h:522
unsigned char num_used_hosts
Definition: download.h:292
curl_slist * Get(const char *header)
Definition: download.cc:731
std::string Print(curl_slist *slist)
Definition: download.cc:721
unsigned opt_proxy_groups_current_burned_
Definition: download.h:547
unsigned opt_proxy_groups_reset_after_
Definition: download.h:609
void SetUrlOptions(JobInfo *info)
Definition: download.cc:903
void ReleaseCredential(JobInfo *info)
Definition: download.cc:1210
unsigned backoff_ms
Definition: download.h:294
bool IsUsed(curl_slist *slist)
Definition: download.h:322
std::string opt_proxy_fallback_list_
Definition: download.h:564
void SetHostChain(const std::string &host_list)
void SetNocache(JobInfo *info)
Definition: download.cc:1183
unsigned opt_host_reset_after_
Definition: download.h:617
void SetLowSpeedLimit(const unsigned low_speed_limit)
Definition: download.cc:1887
std::string proxy_template_direct_
Definition: download.h:593
static int ParseHttpCode(const char digits[3])
Definition: download.cc:403
FRIEND_TEST(T_Download, ValidateGeoReply)
static const int kProbeGeo
Definition: download.h:385
static const unsigned kBlockSize
Definition: download.h:320
unsigned opt_proxy_groups_current_
Definition: download.h:542
off_t range_offset
Definition: download.h:175
shash::ContextPtr hash_context
Definition: download.h:285
bool ValidateGeoReply(const std::string &reply_order, const unsigned expected_size, std::vector< uint64_t > *reply_vals)
Definition: download.cc:2327
std::vector< ProxyInfo > * current_proxy_group() const
Definition: download.h:491
bool IsFileNotFound()
Definition: download.cc:383
time_t opt_timestamp_backup_proxies_
Definition: download.h:607
void SetProxyChain(const std::string &proxy_list, const std::string &fallback_proxy_list, const ProxySetModes set_mode)
Definition: download.cc:2407
std::string GetProxyList()
Definition: download.cc:2581
unsigned int current_host_chain_index
Definition: download.h:295
std::set< CURL * > * pool_handles_inuse_
Definition: download.h:498
void * cred_data
Definition: download.h:161
pthread_mutex_t * lock_options_
Definition: download.h:515
ProxyInfo * ChooseProxyUnlocked(const shash::Any *hash)
Definition: download.cc:2593
pthread_t thread_download_
Definition: download.h:505
ProxyInfo(const dns::Host &host, const std::string &url)
Definition: download.h:358
std::string opt_proxy_list_
Definition: download.h:560
perf::Counter * sz_transfer_time
Definition: download.h:126
std::vector< std::vector< ProxyInfo > > * opt_proxy_groups_
Definition: download.h:538
unsigned opt_proxy_groups_fallback_
Definition: download.h:552
curl_slist * default_headers_
Definition: download.h:502
curl_slist * GetList(const char *header)
Definition: download.cc:655
void ReleaseCurlHandle(CURL *handle)
Definition: download.cc:817
z_stream zstream
Definition: download.h:284
void SetDnsServer(const std::string &address)
Definition: download.cc:1816
JobInfo(const std::string *u, const bool c, const bool ph, const shash::Any *h)
Definition: download.h:239
FRIEND_TEST(T_HeaderLists, Intrinsics)
static void * MainDownload(void *data)
Definition: download.cc:496
void SetTimeout(const unsigned seconds_proxy, const unsigned seconds_direct)
Definition: download.cc:1873
perf::Counter * n_retries
Definition: download.h:128
std::string opt_dns_server_
Definition: download.h:517
void Backoff(JobInfo *info)
Definition: download.cc:1161
perf::Counter * sz_transferred_bytes
Definition: download.h:125
int32_t atomic_int32
Definition: atomic.h:17
Counter * RegisterTemplated(const std::string &name_minor, const std::string &desc)
Definition: statistics.h:109
void UpdateStatistics(CURL *handle)
Definition: download.cc:1127
void SetDnsTtlLimits(const unsigned min_seconds, const unsigned max_seconds)
Definition: download.cc:1852
void Init(const unsigned max_pool_handles, const perf::StatisticsTemplate &statistics)
Definition: download.cc:1600
std::vector< std::string > opt_proxy_urls_
Definition: download.h:572
const char * Code2Ascii(const Failures error)
Definition: download.h:88
unsigned char num_retries
Definition: download.h:293
void GetProxyInfo(std::vector< std::vector< ProxyInfo > > *proxy_chain, unsigned *current_group, unsigned *fallback_group)
Definition: download.cc:2556
void SetProxyGroupResetDelay(const unsigned seconds)
Definition: download.cc:2704
atomic_int32 multi_threaded_
Definition: download.h:506
dns::NormalResolver * resolver_
Definition: download.h:581
std::vector< curl_slist * > blocks_
Definition: download.h:327
ProxyInfo(const std::string &url)
Definition: download.h:357
dns::IpPreference opt_ip_preference_
Definition: download.h:586
Definition: dns.h:90
perf::Counter * n_host_failover
Definition: download.h:130
void UpdateProxiesUnlocked(const std::string &reason)
Definition: download.cc:2607
bool IsProxyTransferError(const Failures error)
Definition: download.h:76
FILE * destination_file
Definition: download.h:168
void AppendHeader(curl_slist *slist, const char *header)
Definition: download.cc:677
bool follow_redirects
Definition: download.h:156
void SetIpPreference(const dns::IpPreference preference)
Definition: download.cc:1862
perf::Counter * n_requests
Definition: download.h:127
JobInfo(const std::string *u, const bool c, const bool ph, const std::string *p, const shash::Any *h)
Definition: download.h:217
void SetRetryParameters(const unsigned max_retries, const unsigned backoff_init_ms, const unsigned backoff_max_ms)
Definition: download.cc:2723
void SetRegularCache(JobInfo *info)
Definition: download.cc:1197
void CloneProxyConfig(DownloadManager *clone)
Definition: download.cc:2804
void PutList(curl_slist *slist)
Definition: download.cc:712
void SetMaxIpaddrPerProxy(unsigned limit)
Definition: download.cc:2734
DownloadManager * Clone(const perf::StatisticsTemplate &statistics)
Definition: download.cc:2767
const shash::Any * expected_hash
Definition: download.h:171
const std::string * extra_info
Definition: download.h:172
std::vector< int > * opt_host_chain_rtt_
Definition: download.h:534
dns::IpPreference opt_ip_preference() const
Definition: download.h:457
cvmfs::Sink * destination_sink
Definition: download.h:170
SslCertificateStore ssl_certificate_store_
Definition: download.h:630
time_t opt_timestamp_backup_host_
Definition: download.h:616
std::string GetFallbackProxyList()
Definition: download.cc:2585
void SetProxyTemplates(const std::string &direct, const std::string &forced)
Definition: download.cc:2740
IpPreference
Definition: dns.h:46
unsigned opt_backoff_max_ms_
Definition: download.h:523
std::string GetDnsServer() const
Definition: download.cc:1808
unsigned opt_host_chain_current_
Definition: download.h:535
CURL * curl_handle
Definition: download.h:281
CredentialsAttachment * credentials_attachment_
Definition: download.h:619
std::vector< std::string > * opt_host_chain_
Definition: download.h:529
struct pollfd * watch_fds_
Definition: download.h:510
std::map< uint32_t, ProxyInfo * > opt_proxy_map_
Definition: download.h:568
curl_slist * DuplicateList(curl_slist *slist)
Definition: download.cc:660
Failures error_code
Definition: download.h:289
JobInfo(const std::string *u, const bool ph)
Definition: download.h:260
Failures Fetch(JobInfo *info)
Definition: download.cc:1716
struct download::JobInfo::@3 destination_mem
bool CanRetry(const JobInfo *info)
Definition: download.cc:1145
perf::Counter * n_proxy_failover
Definition: download.h:129
JobInfo(const std::string *u, const bool c, const bool ph, FILE *f, const shash::Any *h)
Definition: download.h:228
void GetTimeout(unsigned *seconds_proxy, unsigned *seconds_direct)
Definition: download.cc:1896
std::string proxy_template_forced_
Definition: download.h:599
const std::string * destination_path
Definition: download.h:169
time_t opt_timestamp_failover_proxies_
Definition: download.h:608
void SetDnsParameters(const unsigned retries, const unsigned timeout_ms)
Definition: download.cc:1834
static const int kProbeUnprobed
Definition: download.h:376
virtual void ReleaseCurlHandle(CURL *curl_handle, void *info_data)=0
static const unsigned kMaxMemSize
Definition: download.h:390
bool IsHostTransferError(const Failures error)
Definition: download.h:64
JobInfo(const std::string *u, const bool c, const bool ph, cvmfs::Sink *s, const shash::Any *h)
Definition: download.h:249
static const unsigned kDnsDefaultRetries
Definition: download.h:392
bool GeoSortServers(std::vector< std::string > *servers, std::vector< uint64_t > *output_order=NULL)
Definition: download.cc:2126
static const int kProbeDown
Definition: download.h:381
curl_slist * headers
Definition: download.h:282
unsigned char num_used_proxies
Definition: download.h:291
Counters(perf::StatisticsTemplate statistics)
Definition: download.h:132
std::string proxy
Definition: download.h:287
static const unsigned kProxyMapScale
Definition: download.h:394
void GetHostInfo(std::vector< std::string > *host_chain, std::vector< int > *rtt, unsigned *current_host)
Definition: download.cc:1940
bool ValidateProxyIpsUnlocked(const std::string &url, const dns::Host &host)
Definition: download.cc:1063
bool VerifyAndFinalize(const int curl_error, JobInfo *info)
Definition: download.cc:1226
void CutHeader(const char *header, curl_slist **slist)
Definition: download.cc:693
const std::string * url
Definition: download.h:152
void SwitchProxy(JobInfo *info)
Definition: download.cc:1960
void SetCredentialsAttachment(CredentialsAttachment *ca)
Definition: download.cc:1800
std::set< CURL * > * pool_handles_idle_
Definition: download.h:497
void RebalanceProxiesUnlocked(const std::string &reason)
Definition: download.cc:2671
pthread_mutex_t * lock_synchronous_mode_
Definition: download.h:516
virtual bool ConfigureCurlHandle(CURL *curl_handle, pid_t pid, void **info_data)=0
void InitializeRequest(JobInfo *info, CURL *handle)
Definition: download.cc:835
static int CallbackCurlSocket(CURL *easy, curl_socket_t s, int action, void *userp, void *socketp)
Definition: download.cc:419
HeaderLists * header_lists_
Definition: download.h:501
void SetHostResetDelay(const unsigned seconds)
Definition: download.cc:2714
void Put(curl_slist *slist)
Definition: download.cc:748
char * info_header
Definition: download.h:283