| Index: libcurl_http_fetcher.cc | 
| diff --git a/libcurl_http_fetcher.cc b/libcurl_http_fetcher.cc | 
| index 1dcea9ea1b55d073b170ff6a5125b9262da77775..c8468125f042aabd5a67eaf765b3d02e12ed17c2 100644 | 
| --- a/libcurl_http_fetcher.cc | 
| +++ b/libcurl_http_fetcher.cc | 
| @@ -81,7 +81,6 @@ void LibcurlHttpFetcher::ResumeTransfer(const std::string& url) { | 
| // Begins the transfer, which must not have already been started. | 
| void LibcurlHttpFetcher::BeginTransfer(const std::string& url) { | 
| transfer_size_ = -1; | 
| -  bytes_downloaded_ = 0; | 
| resume_offset_ = 0; | 
| retry_count_ = 0; | 
| http_response_code_ = 0; | 
| @@ -90,7 +89,10 @@ void LibcurlHttpFetcher::BeginTransfer(const std::string& url) { | 
| } | 
|  | 
| void LibcurlHttpFetcher::TerminateTransfer() { | 
| -  CleanUp(); | 
| +  if (in_write_callback_) | 
| +    terminate_requested_ = true; | 
| +  else | 
| +    CleanUp(); | 
| } | 
|  | 
| void LibcurlHttpFetcher::CurlPerformOnce() { | 
| @@ -102,17 +104,18 @@ void LibcurlHttpFetcher::CurlPerformOnce() { | 
| // returns, so we do. libcurl promises that curl_multi_perform will not block. | 
| while (CURLM_CALL_MULTI_PERFORM == retcode) { | 
| retcode = curl_multi_perform(curl_multi_handle_, &running_handles); | 
| +    if (terminate_requested_) { | 
| +      CleanUp(); | 
| +      return; | 
| +    } | 
| } | 
| if (0 == running_handles) { | 
| -    long http_response_code = 0; | 
| -    if (curl_easy_getinfo(curl_handle_, | 
| -                          CURLINFO_RESPONSE_CODE, | 
| -                          &http_response_code) == CURLE_OK) { | 
| -      LOG(INFO) << "HTTP response code: " << http_response_code; | 
| +    GetHttpResponseCode(); | 
| +    if (http_response_code_) { | 
| +      LOG(INFO) << "HTTP response code: " << http_response_code_; | 
| } else { | 
| LOG(ERROR) << "Unable to get http response code."; | 
| } | 
| -    http_response_code_ = static_cast<int>(http_response_code); | 
|  | 
| // we're done! | 
| CleanUp(); | 
| @@ -135,8 +138,8 @@ void LibcurlHttpFetcher::CurlPerformOnce() { | 
| } else { | 
| if (delegate_) { | 
| // success is when http_response_code is 2xx | 
| -        bool success = (http_response_code >= 200) && | 
| -            (http_response_code < 300); | 
| +        bool success = (http_response_code_ >= 200) && | 
| +            (http_response_code_ < 300); | 
| delegate_->TransferComplete(this, success); | 
| } | 
| } | 
| @@ -147,6 +150,7 @@ void LibcurlHttpFetcher::CurlPerformOnce() { | 
| } | 
|  | 
| size_t LibcurlHttpFetcher::LibcurlWrite(void *ptr, size_t size, size_t nmemb) { | 
| +  GetHttpResponseCode(); | 
| { | 
| double transfer_size_double; | 
| CHECK_EQ(curl_easy_getinfo(curl_handle_, | 
| @@ -158,8 +162,10 @@ size_t LibcurlHttpFetcher::LibcurlWrite(void *ptr, size_t size, size_t nmemb) { | 
| } | 
| } | 
| bytes_downloaded_ += size * nmemb; | 
| +  in_write_callback_ = true; | 
| if (delegate_) | 
| delegate_->ReceivedBytes(this, reinterpret_cast<char*>(ptr), size * nmemb); | 
| +  in_write_callback_ = false; | 
| return size * nmemb; | 
| } | 
|  | 
| @@ -294,4 +300,13 @@ void LibcurlHttpFetcher::CleanUp() { | 
| transfer_in_progress_ = false; | 
| } | 
|  | 
| +void LibcurlHttpFetcher::GetHttpResponseCode() { | 
| +  long http_response_code = 0; | 
| +  if (curl_easy_getinfo(curl_handle_, | 
| +                        CURLINFO_RESPONSE_CODE, | 
| +                        &http_response_code) == CURLE_OK) { | 
| +    http_response_code_ = static_cast<int>(http_response_code); | 
| +  } | 
| +} | 
| + | 
| }  // namespace chromeos_update_engine | 
|  |