libcurl_http_fetcher.h revision 7f9aea2748370b0a26e1d5c36db7d8bbf3ba1245
149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// Copyright (c) 2009 The Chromium OS Authors. All rights reserved.
249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// Use of this source code is governed by a BSD-style license that can be
349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// found in the LICENSE file.
449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
5c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com#ifndef CHROMEOS_PLATFORM_UPDATE_ENGINE_LIBCURL_HTTP_FETCHER_H__
6c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com#define CHROMEOS_PLATFORM_UPDATE_ENGINE_LIBCURL_HTTP_FETCHER_H__
749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com#include <map>
949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com#include <string>
107f9aea2748370b0a26e1d5c36db7d8bbf3ba1245Bruno Rocha
117f9aea2748370b0a26e1d5c36db7d8bbf3ba1245Bruno Rocha#include <base/basictypes.h>
127f9aea2748370b0a26e1d5c36db7d8bbf3ba1245Bruno Rocha#include <base/logging.h>
1349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com#include <curl/curl.h>
1449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com#include <glib.h>
157f9aea2748370b0a26e1d5c36db7d8bbf3ba1245Bruno Rocha
167f9aea2748370b0a26e1d5c36db7d8bbf3ba1245Bruno Rocha#include "update_engine/certificate_checker.h"
1749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com#include "update_engine/http_fetcher.h"
1849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
1949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// This is a concrete implementation of HttpFetcher that uses libcurl to do the
2049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// http work.
2149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
2249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comnamespace chromeos_update_engine {
2349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
2449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comclass LibcurlHttpFetcher : public HttpFetcher {
2549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com public:
2641c2fcf4525a3b4e8960c4b71dfe4f4f11c8224fDarin Petkov  static const int kMaxRedirects = 10;
2741c2fcf4525a3b4e8960c4b71dfe4f4f11c8224fDarin Petkov
284516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes  explicit LibcurlHttpFetcher(ProxyResolver* proxy_resolver)
294516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes      : HttpFetcher(proxy_resolver),
304516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes        curl_multi_handle_(NULL),
31b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov        curl_handle_(NULL),
32b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov        timeout_source_(NULL),
33b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov        transfer_in_progress_(false),
343fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes        transfer_size_(0),
353fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes        bytes_downloaded_(0),
363fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes        resume_offset_(0),
37b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov        retry_count_(0),
38b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov        retry_seconds_(60),
39a092955cdf763260563a774f6a68e1bfb38c5a8bDarin Petkov        no_network_retry_count_(0),
40a092955cdf763260563a774f6a68e1bfb38c5a8bDarin Petkov        no_network_max_retries_(0),
413fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes        idle_seconds_(1),
42d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes        force_connection_type_(false),
43d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes        forced_expensive_connection_(false),
44fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov        force_build_type_(false),
45fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov        forced_official_build_(false),
463fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes        in_write_callback_(false),
474516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes        sent_byte_(false),
487f9aea2748370b0a26e1d5c36db7d8bbf3ba1245Bruno Rocha        terminate_requested_(false),
497f9aea2748370b0a26e1d5c36db7d8bbf3ba1245Bruno Rocha        check_certificate_(CertificateChecker::kNone) {}
5049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
5149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // Cleans up all internal state. Does not notify delegate
5249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  ~LibcurlHttpFetcher();
5349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
543fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes  void SetOffset(off_t offset) { bytes_downloaded_ = offset; }
553fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes
5649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // Begins the transfer if it hasn't already begun.
5749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  virtual void BeginTransfer(const std::string& url);
5849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
599ce452b6acd95899e9adb17c2935012625163dc6Darin Petkov  // If the transfer is in progress, aborts the transfer early. The transfer
609ce452b6acd95899e9adb17c2935012625163dc6Darin Petkov  // cannot be resumed.
6149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  virtual void TerminateTransfer();
6249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
6349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // Suspend the transfer by calling curl_easy_pause(CURLPAUSE_ALL).
6449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  virtual void Pause();
6549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
6649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // Resume the transfer by calling curl_easy_pause(CURLPAUSE_CONT).
6749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  virtual void Unpause();
6849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
6949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // Libcurl sometimes asks to be called back after some time while
7049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // leaving that time unspecified. In that case, we pick a reasonable
7149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // default of one second, but it can be overridden here. This is
7249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // primarily useful for testing.
7349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // From http://curl.haxx.se/libcurl/c/curl_multi_timeout.html:
7449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  //     if libcurl returns a -1 timeout here, it just means that libcurl
7549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  //     currently has no stored timeout value. You must not wait too long
7649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  //     (more than a few seconds perhaps) before you call
7749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  //     curl_multi_perform() again.
78b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov  void set_idle_seconds(int seconds) { idle_seconds_ = seconds; }
79b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov
80b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov  // Sets the retry timeout. Useful for testing.
81b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov  void set_retry_seconds(int seconds) { retry_seconds_ = seconds; }
82fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov
83a092955cdf763260563a774f6a68e1bfb38c5a8bDarin Petkov  void set_no_network_max_retries(int retries) {
84a092955cdf763260563a774f6a68e1bfb38c5a8bDarin Petkov    no_network_max_retries_ = retries;
85a092955cdf763260563a774f6a68e1bfb38c5a8bDarin Petkov  }
86a092955cdf763260563a774f6a68e1bfb38c5a8bDarin Petkov
87d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  void SetConnectionAsExpensive(bool is_expensive) {
88d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    force_connection_type_ = true;
89d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    forced_expensive_connection_ = is_expensive;
90d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  }
91b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov
92fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov  void SetBuildType(bool is_official) {
93fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov    force_build_type_ = true;
94fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov    forced_official_build_ = is_official;
95fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov  }
96fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov
977f9aea2748370b0a26e1d5c36db7d8bbf3ba1245Bruno Rocha  void set_check_certificate(
987f9aea2748370b0a26e1d5c36db7d8bbf3ba1245Bruno Rocha      CertificateChecker::ServerToCheck check_certificate) {
997f9aea2748370b0a26e1d5c36db7d8bbf3ba1245Bruno Rocha    check_certificate_ = check_certificate;
1007f9aea2748370b0a26e1d5c36db7d8bbf3ba1245Bruno Rocha  }
1017f9aea2748370b0a26e1d5c36db7d8bbf3ba1245Bruno Rocha
10249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com private:
103f3ed8e7d4ad456a3c841d8a530f308b6fcb2a4ccAndrew de los Reyes  // Callback for when proxy resolution has completed. This begins the
104f3ed8e7d4ad456a3c841d8a530f308b6fcb2a4ccAndrew de los Reyes  // transfer.
105f3ed8e7d4ad456a3c841d8a530f308b6fcb2a4ccAndrew de los Reyes  void ProxiesResolved();
106f3ed8e7d4ad456a3c841d8a530f308b6fcb2a4ccAndrew de los Reyes
1073fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes  // Asks libcurl for the http response code and stores it in the object.
1083fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes  void GetHttpResponseCode();
1093fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes
110c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com  // Resumes a transfer where it left off. This will use the
111c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com  // HTTP Range: header to make a new connection from where the last
112c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com  // left off.
113c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com  virtual void ResumeTransfer(const std::string& url);
11449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
11549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // These two methods are for glib main loop callbacks. They are called
11649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // when either a file descriptor is ready for work or when a timer
11749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // has fired. The static versions are shims for libcurl which has a C API.
11849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  bool FDCallback(GIOChannel *source, GIOCondition condition);
11949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  static gboolean StaticFDCallback(GIOChannel *source,
12049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com                                   GIOCondition condition,
12149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com                                   gpointer data) {
12249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com    return reinterpret_cast<LibcurlHttpFetcher*>(data)->FDCallback(source,
12349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com                                                                   condition);
12449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  }
1253270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes  gboolean TimeoutCallback();
12649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  static gboolean StaticTimeoutCallback(gpointer data) {
12749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com    return reinterpret_cast<LibcurlHttpFetcher*>(data)->TimeoutCallback();
12849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  }
129b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov
1309bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes  gboolean RetryTimeoutCallback();
1319bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes  static gboolean StaticRetryTimeoutCallback(void* arg) {
1329bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes    return static_cast<LibcurlHttpFetcher*>(arg)->RetryTimeoutCallback();
1339bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes  }
13449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
13549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // Calls into curl_multi_perform to let libcurl do its work. Returns after
13649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // curl_multi_perform is finished, which may actually be after more than
13749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // one call to curl_multi_perform. This method will set up the glib run
13849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // loop with sources for future work that libcurl will do.
13949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // This method will not block.
1403270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes  // Returns true if we should resume immediately after this call.
141cb319330c529b0394f6efb416dbe7b03bf38b19bAndrew de los Reyes  void CurlPerformOnce();
14249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
14349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // Sets up glib main loop sources as needed by libcurl. This is generally
14449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // the file descriptor of the socket and a timer in case nothing happens
14549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // on the fds.
14649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  void SetupMainloopSources();
14749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
14849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // Callback called by libcurl when new data has arrived on the transfer
14949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  size_t LibcurlWrite(void *ptr, size_t size, size_t nmemb);
15049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  static size_t StaticLibcurlWrite(void *ptr, size_t size,
15149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com                                   size_t nmemb, void *stream) {
15249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com    return reinterpret_cast<LibcurlHttpFetcher*>(stream)->
15349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com        LibcurlWrite(ptr, size, nmemb);
15449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  }
15549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
15649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // Cleans up the following if they are non-null:
15749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // curl(m) handles, io_channels_, timeout_source_.
15849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  void CleanUp();
15949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
1609ce452b6acd95899e9adb17c2935012625163dc6Darin Petkov  // Force terminate the transfer. This will invoke the delegate's (if any)
1619ce452b6acd95899e9adb17c2935012625163dc6Darin Petkov  // TransferTerminated callback so, after returning, this fetcher instance may
1629ce452b6acd95899e9adb17c2935012625163dc6Darin Petkov  // be destroyed.
1639ce452b6acd95899e9adb17c2935012625163dc6Darin Petkov  void ForceTransferTermination();
1649ce452b6acd95899e9adb17c2935012625163dc6Darin Petkov
165d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  // Returns whether or not the current network connection is considered
166d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  // expensive.
167d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  bool ConnectionIsExpensive() const;
168d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
169fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov  // Returns whether or not the current build is official.
170fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov  bool IsOfficialBuild() const;
171fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov
17249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // Handles for the libcurl library
17349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  CURLM *curl_multi_handle_;
17449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  CURL *curl_handle_;
17549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
17660e1415b31b58bc17017d29c8e06f6e5452fdf4eDarin Petkov  // Lists of all read(0)/write(1) file descriptors that we're waiting on from
17760e1415b31b58bc17017d29c8e06f6e5452fdf4eDarin Petkov  // the glib main loop. libcurl may open/close descriptors and switch their
17860e1415b31b58bc17017d29c8e06f6e5452fdf4eDarin Petkov  // directions so maintain two separate lists so that watch conditions can be
17960e1415b31b58bc17017d29c8e06f6e5452fdf4eDarin Petkov  // set appropriately.
18049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  typedef std::map<int, std::pair<GIOChannel*, guint> > IOChannels;
18160e1415b31b58bc17017d29c8e06f6e5452fdf4eDarin Petkov  IOChannels io_channels_[2];
18249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
18349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // if non-NULL, a timer we're waiting on. glib main loop will call us back
18449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // when it fires.
18549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  GSource* timeout_source_;
18649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
18749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  bool transfer_in_progress_;
18849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
189c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com  // The transfer size. -1 if not known.
190c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com  off_t transfer_size_;
191c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com
192c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com  // How many bytes have been downloaded and sent to the delegate.
193c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com  off_t bytes_downloaded_;
194c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com
195c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com  // If we resumed an earlier transfer, data offset that we used for the
196c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com  // new connection.  0 otherwise.
1973fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes  // In this class, resume refers to resuming a dropped HTTP connection,
1983fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes  // not to resuming an interrupted download.
199c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com  off_t resume_offset_;
200b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov
2019bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes  // Number of resumes performed.
2029bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes  int retry_count_;
203c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com
204b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov  // Seconds to wait before retrying a resume.
205b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov  int retry_seconds_;
206b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov
207a092955cdf763260563a774f6a68e1bfb38c5a8bDarin Petkov  // Number of resumes due to no network (e.g., HTTP response code 0).
208a092955cdf763260563a774f6a68e1bfb38c5a8bDarin Petkov  int no_network_retry_count_;
209a092955cdf763260563a774f6a68e1bfb38c5a8bDarin Petkov  int no_network_max_retries_;
210a092955cdf763260563a774f6a68e1bfb38c5a8bDarin Petkov
211b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov  // Seconds to wait before asking libcurl to "perform".
212b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov  int idle_seconds_;
213fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov
214d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  // If true, assume the network is expensive or not, according to
215d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  // forced_expensive_connection_. (Useful for testing).
216d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  bool force_connection_type_;
217d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  bool forced_expensive_connection_;
218b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov
219fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov  // If true, assume the build is official or not, according to
220fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov  // forced_official_build_. Useful for testing.
221fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov  bool force_build_type_;
222fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov  bool forced_official_build_;
223fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov
2243fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes  // If true, we are currently performing a write callback on the delegate.
2253fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes  bool in_write_callback_;
226a092955cdf763260563a774f6a68e1bfb38c5a8bDarin Petkov
2274516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes  // If true, we have returned at least one byte in the write callback
2284516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes  // to the delegate.
2294516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes  bool sent_byte_;
230fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov
2313fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes  // We can't clean everything up while we're in a write callback, so
2323fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes  // if we get a terminate request, queue it until we can handle it.
2333fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes  bool terminate_requested_;
2343fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes
2357f9aea2748370b0a26e1d5c36db7d8bbf3ba1245Bruno Rocha  // Represents which server certificate to be checked against this
2367f9aea2748370b0a26e1d5c36db7d8bbf3ba1245Bruno Rocha  // connection's certificate. If no certificate check needs to be performed,
2377f9aea2748370b0a26e1d5c36db7d8bbf3ba1245Bruno Rocha  // this should be kNone.
2387f9aea2748370b0a26e1d5c36db7d8bbf3ba1245Bruno Rocha  CertificateChecker::ServerToCheck check_certificate_;
2397f9aea2748370b0a26e1d5c36db7d8bbf3ba1245Bruno Rocha
24049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  DISALLOW_COPY_AND_ASSIGN(LibcurlHttpFetcher);
24149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com};
24249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
24349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com}  // namespace chromeos_update_engine
24449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
245c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com#endif  // CHROMEOS_PLATFORM_UPDATE_ENGINE_LIBCURL_HTTP_FETCHER_H__
246