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