| Index: components/update_client/url_fetcher_downloader.cc
|
| diff --git a/components/update_client/url_fetcher_downloader.cc b/components/update_client/url_fetcher_downloader.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..fd7f3da0b0bb54c227841b9e7de84d4e91879676
|
| --- /dev/null
|
| +++ b/components/update_client/url_fetcher_downloader.cc
|
| @@ -0,0 +1,109 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "components/update_client/url_fetcher_downloader.h"
|
| +
|
| +#include <stdint.h>
|
| +
|
| +#include "base/logging.h"
|
| +#include "base/sequenced_task_runner.h"
|
| +#include "components/update_client/utils.h"
|
| +#include "net/base/load_flags.h"
|
| +#include "net/url_request/url_fetcher.h"
|
| +#include "url/gurl.h"
|
| +
|
| +namespace update_client {
|
| +
|
| +UrlFetcherDownloader::UrlFetcherDownloader(
|
| + scoped_ptr<CrxDownloader> successor,
|
| + net::URLRequestContextGetter* context_getter,
|
| + scoped_refptr<base::SequencedTaskRunner> task_runner)
|
| + : CrxDownloader(successor.Pass()),
|
| + context_getter_(context_getter),
|
| + task_runner_(task_runner),
|
| + downloaded_bytes_(-1),
|
| + total_bytes_(-1) {
|
| +}
|
| +
|
| +UrlFetcherDownloader::~UrlFetcherDownloader() {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| +}
|
| +
|
| +void UrlFetcherDownloader::DoStartDownload(const GURL& url) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| +
|
| + url_fetcher_.reset(
|
| + net::URLFetcher::Create(0, url, net::URLFetcher::GET, this));
|
| + url_fetcher_->SetRequestContext(context_getter_);
|
| + url_fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SEND_COOKIES |
|
| + net::LOAD_DO_NOT_SAVE_COOKIES |
|
| + net::LOAD_DISABLE_CACHE);
|
| + url_fetcher_->SetAutomaticallyRetryOn5xx(false);
|
| + url_fetcher_->SaveResponseToTemporaryFile(task_runner_);
|
| +
|
| + VLOG(1) << "Starting background download: " << url.spec();
|
| + url_fetcher_->Start();
|
| +
|
| + download_start_time_ = base::Time::Now();
|
| +
|
| + downloaded_bytes_ = -1;
|
| + total_bytes_ = -1;
|
| +}
|
| +
|
| +void UrlFetcherDownloader::OnURLFetchComplete(const net::URLFetcher* source) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| +
|
| + const base::Time download_end_time(base::Time::Now());
|
| + const base::TimeDelta download_time =
|
| + download_end_time >= download_start_time_
|
| + ? download_end_time - download_start_time_
|
| + : base::TimeDelta();
|
| +
|
| + // Consider a 5xx response from the server as an indication to terminate
|
| + // the request and avoid overloading the server in this case.
|
| + // is not accepting requests for the moment.
|
| + const int fetch_error(GetFetchError(*url_fetcher_));
|
| + const bool is_handled = fetch_error == 0 || IsHttpServerError(fetch_error);
|
| +
|
| + Result result;
|
| + result.error = fetch_error;
|
| + if (!fetch_error) {
|
| + source->GetResponseAsFilePath(true, &result.response);
|
| + }
|
| + result.downloaded_bytes = downloaded_bytes_;
|
| + result.total_bytes = total_bytes_;
|
| +
|
| + DownloadMetrics download_metrics;
|
| + download_metrics.url = url();
|
| + download_metrics.downloader = DownloadMetrics::kUrlFetcher;
|
| + download_metrics.error = fetch_error;
|
| + download_metrics.downloaded_bytes = downloaded_bytes_;
|
| + download_metrics.total_bytes = total_bytes_;
|
| + download_metrics.download_time_ms = download_time.InMilliseconds();
|
| +
|
| + base::FilePath local_path_;
|
| + source->GetResponseAsFilePath(false, &local_path_);
|
| + VLOG(1) << "Downloaded " << downloaded_bytes_ << " bytes in "
|
| + << download_time.InMilliseconds() << "ms from "
|
| + << source->GetURL().spec() << " to " << local_path_.value();
|
| + CrxDownloader::OnDownloadComplete(is_handled, result, download_metrics);
|
| +}
|
| +
|
| +void UrlFetcherDownloader::OnURLFetchDownloadProgress(
|
| + const net::URLFetcher* source,
|
| + int64_t current,
|
| + int64_t total) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| +
|
| + downloaded_bytes_ = current;
|
| + total_bytes_ = total;
|
| +
|
| + Result result;
|
| + result.downloaded_bytes = downloaded_bytes_;
|
| + result.total_bytes = total_bytes_;
|
| +
|
| + OnDownloadProgress(result);
|
| +}
|
| +
|
| +} // namespace update_client
|
|
|