Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2009 The Chromium OS Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium OS Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "update_engine/libcurl_http_fetcher.h" | 5 #include "update_engine/libcurl_http_fetcher.h" |
| 6 #include <algorithm> | 6 #include <algorithm> |
| 7 #include "chromeos/obsolete_logging.h" | 7 #include "chromeos/obsolete_logging.h" |
| 8 | 8 |
| 9 using std::max; | 9 using std::max; |
| 10 using std::make_pair; | 10 using std::make_pair; |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 72 resume_offset_ = 0; | 72 resume_offset_ = 0; |
| 73 retry_count_ = 0; | 73 retry_count_ = 0; |
| 74 ResumeTransfer(url); | 74 ResumeTransfer(url); |
| 75 CurlPerformOnce(); | 75 CurlPerformOnce(); |
| 76 } | 76 } |
| 77 | 77 |
| 78 void LibcurlHttpFetcher::TerminateTransfer() { | 78 void LibcurlHttpFetcher::TerminateTransfer() { |
| 79 CleanUp(); | 79 CleanUp(); |
| 80 } | 80 } |
| 81 | 81 |
| 82 bool LibcurlHttpFetcher::CurlPerformOnce() { | 82 void LibcurlHttpFetcher::CurlPerformOnce() { |
| 83 CHECK(transfer_in_progress_); | 83 CHECK(transfer_in_progress_); |
| 84 int running_handles = 0; | 84 int running_handles = 0; |
| 85 CURLMcode retcode = CURLM_CALL_MULTI_PERFORM; | 85 CURLMcode retcode = CURLM_CALL_MULTI_PERFORM; |
| 86 | 86 |
| 87 // libcurl may request that we immediately call curl_multi_perform after it | 87 // libcurl may request that we immediately call curl_multi_perform after it |
| 88 // returns, so we do. libcurl promises that curl_multi_perform will not block. | 88 // returns, so we do. libcurl promises that curl_multi_perform will not block. |
| 89 while (CURLM_CALL_MULTI_PERFORM == retcode) { | 89 while (CURLM_CALL_MULTI_PERFORM == retcode) { |
| 90 retcode = curl_multi_perform(curl_multi_handle_, &running_handles); | 90 retcode = curl_multi_perform(curl_multi_handle_, &running_handles); |
| 91 } | 91 } |
| 92 if (0 == running_handles) { | 92 if (0 == running_handles) { |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 109 << bytes_downloaded_ << " bytes, but transfer_size_ is " | 109 << bytes_downloaded_ << " bytes, but transfer_size_ is " |
| 110 << transfer_size_ << ". retry_count: " << retry_count_; | 110 << transfer_size_ << ". retry_count: " << retry_count_; |
| 111 if (retry_count_ > kMaxRetriesCount) { | 111 if (retry_count_ > kMaxRetriesCount) { |
| 112 if (delegate_) | 112 if (delegate_) |
| 113 delegate_->TransferComplete(this, false); // success | 113 delegate_->TransferComplete(this, false); // success |
| 114 } else { | 114 } else { |
| 115 g_timeout_add(5 * 1000, | 115 g_timeout_add(5 * 1000, |
| 116 &LibcurlHttpFetcher::StaticRetryTimeoutCallback, | 116 &LibcurlHttpFetcher::StaticRetryTimeoutCallback, |
| 117 this); | 117 this); |
| 118 } | 118 } |
| 119 return false; | 119 return; |
| 120 } else { | 120 } else { |
| 121 if (delegate_) { | 121 if (delegate_) { |
| 122 // success is when http_response_code is 200 | 122 // success is when http_response_code is 200 |
| 123 delegate_->TransferComplete(this, http_response_code == 200); | 123 delegate_->TransferComplete(this, http_response_code == 200); |
| 124 } | 124 } |
| 125 } | 125 } |
| 126 } else { | 126 } else { |
| 127 // set up callback | 127 // set up callback |
| 128 SetupMainloopSources(); | 128 SetupMainloopSources(); |
| 129 } | 129 } |
| 130 return false; | |
| 131 } | 130 } |
| 132 | 131 |
| 133 size_t LibcurlHttpFetcher::LibcurlWrite(void *ptr, size_t size, size_t nmemb) { | 132 size_t LibcurlHttpFetcher::LibcurlWrite(void *ptr, size_t size, size_t nmemb) { |
| 134 { | 133 { |
| 135 double transfer_size_double; | 134 double transfer_size_double; |
| 136 CHECK_EQ(curl_easy_getinfo(curl_handle_, | 135 CHECK_EQ(curl_easy_getinfo(curl_handle_, |
| 137 CURLINFO_CONTENT_LENGTH_DOWNLOAD, | 136 CURLINFO_CONTENT_LENGTH_DOWNLOAD, |
| 138 &transfer_size_double), CURLE_OK); | 137 &transfer_size_double), CURLE_OK); |
| 139 off_t new_transfer_size = static_cast<off_t>(transfer_size_double); | 138 off_t new_transfer_size = static_cast<off_t>(transfer_size_double); |
| 140 if (new_transfer_size > 0) { | 139 if (new_transfer_size > 0) { |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 251 return true; | 250 return true; |
| 252 } | 251 } |
| 253 | 252 |
| 254 gboolean LibcurlHttpFetcher::RetryTimeoutCallback() { | 253 gboolean LibcurlHttpFetcher::RetryTimeoutCallback() { |
| 255 ResumeTransfer(url_); | 254 ResumeTransfer(url_); |
| 256 CurlPerformOnce(); | 255 CurlPerformOnce(); |
| 257 return FALSE; // Don't have glib auto call this callback again | 256 return FALSE; // Don't have glib auto call this callback again |
| 258 } | 257 } |
| 259 | 258 |
| 260 gboolean LibcurlHttpFetcher::TimeoutCallback() { | 259 gboolean LibcurlHttpFetcher::TimeoutCallback() { |
| 260 // We always return true, even if we don't want glib to cll us back. | |
|
petkov
2010/07/17 04:32:43
typo: cll
| |
| 261 // We will remove the event source separately if we don't want to | |
| 262 // be called back. | |
| 261 if (!transfer_in_progress_) | 263 if (!transfer_in_progress_) |
| 262 return TRUE; | 264 return TRUE; |
| 263 // Since we will return false from this function, which tells glib to | |
| 264 // destroy the timeout callback, we must NULL it out here. This way, when | |
| 265 // setting up callback sources again, we won't try to delete this (doomed) | |
| 266 // timeout callback then. | |
| 267 // TODO(adlr): optimize by checking if we can keep this timeout callback. | |
| 268 //timeout_source_ = NULL; | |
| 269 CurlPerformOnce(); | 265 CurlPerformOnce(); |
| 270 return TRUE; | 266 return TRUE; |
| 271 } | 267 } |
| 272 | 268 |
| 273 void LibcurlHttpFetcher::CleanUp() { | 269 void LibcurlHttpFetcher::CleanUp() { |
| 274 if (timeout_source_) { | 270 if (timeout_source_) { |
| 275 g_source_destroy(timeout_source_); | 271 g_source_destroy(timeout_source_); |
| 276 timeout_source_ = NULL; | 272 timeout_source_ = NULL; |
| 277 } | 273 } |
| 278 | 274 |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 292 curl_handle_ = NULL; | 288 curl_handle_ = NULL; |
| 293 } | 289 } |
| 294 if (curl_multi_handle_) { | 290 if (curl_multi_handle_) { |
| 295 CHECK_EQ(curl_multi_cleanup(curl_multi_handle_), CURLM_OK); | 291 CHECK_EQ(curl_multi_cleanup(curl_multi_handle_), CURLM_OK); |
| 296 curl_multi_handle_ = NULL; | 292 curl_multi_handle_ = NULL; |
| 297 } | 293 } |
| 298 transfer_in_progress_ = false; | 294 transfer_in_progress_ = false; |
| 299 } | 295 } |
| 300 | 296 |
| 301 } // namespace chromeos_update_engine | 297 } // namespace chromeos_update_engine |
| OLD | NEW |