libcurl_http_fetcher.h revision a092955cdf763260563a774f6a68e1bfb38c5a8b
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>
1049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com#include <curl/curl.h>
1149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com#include <glib.h>
1249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com#include "base/basictypes.h"
13790e62e2d8114647b0785574bea361cf931c482bChris Masone#include "base/logging.h"
1449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com#include "update_engine/http_fetcher.h"
1549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
1649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// This is a concrete implementation of HttpFetcher that uses libcurl to do the
1749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// http work.
1849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
1949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comnamespace chromeos_update_engine {
2049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
2149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comclass LibcurlHttpFetcher : public HttpFetcher {
2249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com public:
2341c2fcf4525a3b4e8960c4b71dfe4f4f11c8224fDarin Petkov  static const int kMaxRedirects = 10;
2441c2fcf4525a3b4e8960c4b71dfe4f4f11c8224fDarin Petkov
254516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes  explicit LibcurlHttpFetcher(ProxyResolver* proxy_resolver)
264516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes      : HttpFetcher(proxy_resolver),
274516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes        curl_multi_handle_(NULL),
28b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov        curl_handle_(NULL),
29b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov        timeout_source_(NULL),
30b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov        transfer_in_progress_(false),
313fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes        transfer_size_(0),
323fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes        bytes_downloaded_(0),
333fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes        resume_offset_(0),
34b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov        retry_count_(0),
35b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov        retry_seconds_(60),
36a092955cdf763260563a774f6a68e1bfb38c5a8bDarin Petkov        no_network_retry_count_(0),
37a092955cdf763260563a774f6a68e1bfb38c5a8bDarin Petkov        no_network_max_retries_(0),
383fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes        idle_seconds_(1),
39d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes        force_connection_type_(false),
40d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes        forced_expensive_connection_(false),
41fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov        force_build_type_(false),
42fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov        forced_official_build_(false),
433fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes        in_write_callback_(false),
444516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes        sent_byte_(false),
453fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes        terminate_requested_(false) {}
4649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
4749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // Cleans up all internal state. Does not notify delegate
4849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  ~LibcurlHttpFetcher();
4949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
503fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes  void SetOffset(off_t offset) { bytes_downloaded_ = offset; }
513fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes
5249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // Begins the transfer if it hasn't already begun.
5349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  virtual void BeginTransfer(const std::string& url);
5449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
559ce452b6acd95899e9adb17c2935012625163dc6Darin Petkov  // If the transfer is in progress, aborts the transfer early. The transfer
569ce452b6acd95899e9adb17c2935012625163dc6Darin Petkov  // cannot be resumed.
5749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  virtual void TerminateTransfer();
5849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
5949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // Suspend the transfer by calling curl_easy_pause(CURLPAUSE_ALL).
6049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  virtual void Pause();
6149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
6249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // Resume the transfer by calling curl_easy_pause(CURLPAUSE_CONT).
6349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  virtual void Unpause();
6449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
6549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // Libcurl sometimes asks to be called back after some time while
6649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // leaving that time unspecified. In that case, we pick a reasonable
6749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // default of one second, but it can be overridden here. This is
6849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // primarily useful for testing.
6949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // From http://curl.haxx.se/libcurl/c/curl_multi_timeout.html:
7049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  //     if libcurl returns a -1 timeout here, it just means that libcurl
7149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  //     currently has no stored timeout value. You must not wait too long
7249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  //     (more than a few seconds perhaps) before you call
7349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  //     curl_multi_perform() again.
74b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov  void set_idle_seconds(int seconds) { idle_seconds_ = seconds; }
75b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov
76b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov  // Sets the retry timeout. Useful for testing.
77b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov  void set_retry_seconds(int seconds) { retry_seconds_ = seconds; }
78fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov
79a092955cdf763260563a774f6a68e1bfb38c5a8bDarin Petkov  void set_no_network_max_retries(int retries) {
80a092955cdf763260563a774f6a68e1bfb38c5a8bDarin Petkov    no_network_max_retries_ = retries;
81a092955cdf763260563a774f6a68e1bfb38c5a8bDarin Petkov  }
82a092955cdf763260563a774f6a68e1bfb38c5a8bDarin Petkov
83d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  void SetConnectionAsExpensive(bool is_expensive) {
84d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    force_connection_type_ = true;
85d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    forced_expensive_connection_ = is_expensive;
86d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  }
87b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov
88fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov  void SetBuildType(bool is_official) {
89fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov    force_build_type_ = true;
90fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov    forced_official_build_ = is_official;
91fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov  }
92fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov
9349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com private:
943fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes  // Asks libcurl for the http response code and stores it in the object.
953fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes  void GetHttpResponseCode();
963fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes
97c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com  // Resumes a transfer where it left off. This will use the
98c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com  // HTTP Range: header to make a new connection from where the last
99c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com  // left off.
100c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com  virtual void ResumeTransfer(const std::string& url);
10149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
10249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // These two methods are for glib main loop callbacks. They are called
10349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // when either a file descriptor is ready for work or when a timer
10449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // has fired. The static versions are shims for libcurl which has a C API.
10549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  bool FDCallback(GIOChannel *source, GIOCondition condition);
10649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  static gboolean StaticFDCallback(GIOChannel *source,
10749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com                                   GIOCondition condition,
10849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com                                   gpointer data) {
10949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com    return reinterpret_cast<LibcurlHttpFetcher*>(data)->FDCallback(source,
11049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com                                                                   condition);
11149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  }
1123270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes  gboolean TimeoutCallback();
11349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  static gboolean StaticTimeoutCallback(gpointer data) {
11449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com    return reinterpret_cast<LibcurlHttpFetcher*>(data)->TimeoutCallback();
11549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  }
116b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov
1179bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes  gboolean RetryTimeoutCallback();
1189bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes  static gboolean StaticRetryTimeoutCallback(void* arg) {
1199bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes    return static_cast<LibcurlHttpFetcher*>(arg)->RetryTimeoutCallback();
1209bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes  }
12149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
12249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // Calls into curl_multi_perform to let libcurl do its work. Returns after
12349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // curl_multi_perform is finished, which may actually be after more than
12449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // one call to curl_multi_perform. This method will set up the glib run
12549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // loop with sources for future work that libcurl will do.
12649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // This method will not block.
1273270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes  // Returns true if we should resume immediately after this call.
128cb319330c529b0394f6efb416dbe7b03bf38b19bAndrew de los Reyes  void CurlPerformOnce();
12949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
13049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // Sets up glib main loop sources as needed by libcurl. This is generally
13149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // the file descriptor of the socket and a timer in case nothing happens
13249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // on the fds.
13349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  void SetupMainloopSources();
13449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
13549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // Callback called by libcurl when new data has arrived on the transfer
13649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  size_t LibcurlWrite(void *ptr, size_t size, size_t nmemb);
13749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  static size_t StaticLibcurlWrite(void *ptr, size_t size,
13849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com                                   size_t nmemb, void *stream) {
13949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com    return reinterpret_cast<LibcurlHttpFetcher*>(stream)->
14049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com        LibcurlWrite(ptr, size, nmemb);
14149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  }
14249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
14349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // Cleans up the following if they are non-null:
14449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // curl(m) handles, io_channels_, timeout_source_.
14549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  void CleanUp();
14649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
1479ce452b6acd95899e9adb17c2935012625163dc6Darin Petkov  // Force terminate the transfer. This will invoke the delegate's (if any)
1489ce452b6acd95899e9adb17c2935012625163dc6Darin Petkov  // TransferTerminated callback so, after returning, this fetcher instance may
1499ce452b6acd95899e9adb17c2935012625163dc6Darin Petkov  // be destroyed.
1509ce452b6acd95899e9adb17c2935012625163dc6Darin Petkov  void ForceTransferTermination();
1519ce452b6acd95899e9adb17c2935012625163dc6Darin Petkov
152d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  // Returns whether or not the current network connection is considered
153d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  // expensive.
154d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  bool ConnectionIsExpensive() const;
155d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
156fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov  // Returns whether or not the current build is official.
157fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov  bool IsOfficialBuild() const;
158fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov
15949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // Handles for the libcurl library
16049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  CURLM *curl_multi_handle_;
16149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  CURL *curl_handle_;
16249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
16360e1415b31b58bc17017d29c8e06f6e5452fdf4eDarin Petkov  // Lists of all read(0)/write(1) file descriptors that we're waiting on from
16460e1415b31b58bc17017d29c8e06f6e5452fdf4eDarin Petkov  // the glib main loop. libcurl may open/close descriptors and switch their
16560e1415b31b58bc17017d29c8e06f6e5452fdf4eDarin Petkov  // directions so maintain two separate lists so that watch conditions can be
16660e1415b31b58bc17017d29c8e06f6e5452fdf4eDarin Petkov  // set appropriately.
16749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  typedef std::map<int, std::pair<GIOChannel*, guint> > IOChannels;
16860e1415b31b58bc17017d29c8e06f6e5452fdf4eDarin Petkov  IOChannels io_channels_[2];
16949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
17049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // if non-NULL, a timer we're waiting on. glib main loop will call us back
17149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // when it fires.
17249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  GSource* timeout_source_;
17349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
17449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  bool transfer_in_progress_;
17549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
176c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com  // The transfer size. -1 if not known.
177c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com  off_t transfer_size_;
178c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com
179c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com  // How many bytes have been downloaded and sent to the delegate.
180c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com  off_t bytes_downloaded_;
181c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com
182c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com  // If we resumed an earlier transfer, data offset that we used for the
183c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com  // new connection.  0 otherwise.
1843fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes  // In this class, resume refers to resuming a dropped HTTP connection,
1853fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes  // not to resuming an interrupted download.
186c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com  off_t resume_offset_;
187b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov
1889bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes  // Number of resumes performed.
1899bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes  int retry_count_;
190c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com
191b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov  // Seconds to wait before retrying a resume.
192b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov  int retry_seconds_;
193b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov
194a092955cdf763260563a774f6a68e1bfb38c5a8bDarin Petkov  // Number of resumes due to no network (e.g., HTTP response code 0).
195a092955cdf763260563a774f6a68e1bfb38c5a8bDarin Petkov  int no_network_retry_count_;
196a092955cdf763260563a774f6a68e1bfb38c5a8bDarin Petkov  int no_network_max_retries_;
197a092955cdf763260563a774f6a68e1bfb38c5a8bDarin Petkov
198b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov  // Seconds to wait before asking libcurl to "perform".
199b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov  int idle_seconds_;
200fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov
201d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  // If true, assume the network is expensive or not, according to
202d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  // forced_expensive_connection_. (Useful for testing).
203d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  bool force_connection_type_;
204d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  bool forced_expensive_connection_;
205b83371f6d7fc12a66d33eac614c0fae3aa0978baDarin Petkov
206fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov  // If true, assume the build is official or not, according to
207fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov  // forced_official_build_. Useful for testing.
208fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov  bool force_build_type_;
209fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov  bool forced_official_build_;
210fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov
2113fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes  // If true, we are currently performing a write callback on the delegate.
2123fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes  bool in_write_callback_;
213a092955cdf763260563a774f6a68e1bfb38c5a8bDarin Petkov
2144516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes  // If true, we have returned at least one byte in the write callback
2154516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes  // to the delegate.
2164516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes  bool sent_byte_;
217fc7a0cec794ab43e66b6781ddb7f498b0ce257b9Darin Petkov
2183fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes  // We can't clean everything up while we're in a write callback, so
2193fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes  // if we get a terminate request, queue it until we can handle it.
2203fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes  bool terminate_requested_;
2213fd5d30433509859bfdcc0b650e242981410c6a7Andrew de los Reyes
22249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  DISALLOW_COPY_AND_ASSIGN(LibcurlHttpFetcher);
22349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com};
22449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
22549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com}  // namespace chromeos_update_engine
22649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
227c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com#endif  // CHROMEOS_PLATFORM_UPDATE_ENGINE_LIBCURL_HTTP_FETCHER_H__
228