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