Index: libcurl_http_fetcher.cc |
diff --git a/libcurl_http_fetcher.cc b/libcurl_http_fetcher.cc |
index c6293b17972d63b30b44643b86de5b725bfc60f0..170abfa702e5892ada8dce93b39b6913d646a416 100644 |
--- a/libcurl_http_fetcher.cc |
+++ b/libcurl_http_fetcher.cc |
@@ -25,6 +25,7 @@ namespace chromeos_update_engine { |
namespace { |
const int kMaxRetriesCount = 20; |
+const int kNoNetworkRetrySeconds = 30; |
const char kCACertificatesPath[] = "/usr/share/chromeos-ca-certificates"; |
} // namespace {} |
@@ -152,6 +153,7 @@ void LibcurlHttpFetcher::BeginTransfer(const std::string& url) { |
transfer_size_ = -1; |
resume_offset_ = 0; |
retry_count_ = 0; |
+ no_network_retry_count_ = 0; |
http_response_code_ = 0; |
ResolveProxiesForUrl(url); |
ResumeTransfer(url); |
@@ -192,6 +194,7 @@ void LibcurlHttpFetcher::CurlPerformOnce() { |
GetHttpResponseCode(); |
if (http_response_code_) { |
LOG(INFO) << "HTTP response code: " << http_response_code_; |
+ no_network_retry_count_ = 0; |
} else { |
LOG(ERROR) << "Unable to get http response code."; |
} |
@@ -199,6 +202,21 @@ void LibcurlHttpFetcher::CurlPerformOnce() { |
// we're done! |
CleanUp(); |
+ // TODO(petkov): This temporary code tries to deal with the case where the |
+ // update engine performs an update check while the network is not ready |
+ // (e.g., right after resume). Longer term, we should check if the network |
+ // is online/offline and return an appropriate error code. |
+ if (!sent_byte_ && |
+ http_response_code_ == 0 && |
+ no_network_retry_count_ < no_network_max_retries_) { |
+ no_network_retry_count_++; |
+ g_timeout_add_seconds(kNoNetworkRetrySeconds, |
+ &LibcurlHttpFetcher::StaticRetryTimeoutCallback, |
+ this); |
+ LOG(INFO) << "No HTTP response, retry " << no_network_retry_count_; |
+ return; |
+ } |
+ |
if (!sent_byte_ && |
(http_response_code_ < 200 || http_response_code_ >= 300)) { |
// The transfer completed w/ error and we didn't get any bytes. |