Index: libcurl_http_fetcher.cc |
diff --git a/libcurl_http_fetcher.cc b/libcurl_http_fetcher.cc |
index d5358bd252118b90efa4fd8219192c51d2cf77ca..b65d6b1e2e71aa73abd72e1d4b8b300124a61912 100644 |
--- a/libcurl_http_fetcher.cc |
+++ b/libcurl_http_fetcher.cc |
@@ -28,6 +28,8 @@ const char kCACertificatesPath[] = "/usr/share/update_engine/ca-certificates"; |
} // namespace {} |
LibcurlHttpFetcher::~LibcurlHttpFetcher() { |
+ LOG_IF(ERROR, transfer_in_progress_) |
+ << "Destroying the fetcher while a transfer is in progress."; |
CleanUp(); |
} |
@@ -135,11 +137,20 @@ void LibcurlHttpFetcher::BeginTransfer(const std::string& url) { |
CurlPerformOnce(); |
} |
+void LibcurlHttpFetcher::ForceTransferTermination() { |
+ CleanUp(); |
+ if (delegate_) { |
+ // Note that after the callback returns this object may be destroyed. |
+ delegate_->TransferTerminated(this); |
+ } |
+} |
+ |
void LibcurlHttpFetcher::TerminateTransfer() { |
- if (in_write_callback_) |
+ if (in_write_callback_) { |
terminate_requested_ = true; |
- else |
- CleanUp(); |
+ } else { |
+ ForceTransferTermination(); |
+ } |
} |
void LibcurlHttpFetcher::CurlPerformOnce() { |
@@ -152,7 +163,7 @@ void LibcurlHttpFetcher::CurlPerformOnce() { |
while (CURLM_CALL_MULTI_PERFORM == retcode) { |
retcode = curl_multi_perform(curl_multi_handle_, &running_handles); |
if (terminate_requested_) { |
- CleanUp(); |
+ ForceTransferTermination(); |
return; |
} |
} |