summaryrefslogtreecommitdiff
path: root/chromium/chrome/browser/net/file_downloader.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/chrome/browser/net/file_downloader.cc')
-rw-r--r--chromium/chrome/browser/net/file_downloader.cc106
1 files changed, 106 insertions, 0 deletions
diff --git a/chromium/chrome/browser/net/file_downloader.cc b/chromium/chrome/browser/net/file_downloader.cc
new file mode 100644
index 00000000000..93edaf36fa1
--- /dev/null
+++ b/chromium/chrome/browser/net/file_downloader.cc
@@ -0,0 +1,106 @@
+// Copyright 2015 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 "chrome/browser/net/file_downloader.h"
+
+#include "base/bind.h"
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/logging.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
+#include "base/task_runner_util.h"
+#include "content/public/browser/browser_context.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/storage_partition.h"
+#include "net/base/load_flags.h"
+#include "net/http/http_status_code.h"
+#include "services/network/public/cpp/resource_request.h"
+#include "services/network/public/cpp/shared_url_loader_factory.h"
+#include "services/network/public/cpp/simple_url_loader.h"
+#include "url/gurl.h"
+
+const int kNumFileDownloaderRetries = 1;
+
+FileDownloader::FileDownloader(
+ const GURL& url,
+ const base::FilePath& path,
+ bool overwrite,
+ scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
+ DownloadFinishedCallback callback,
+ const net::NetworkTrafficAnnotationTag& traffic_annotation)
+ : url_loader_factory_(url_loader_factory),
+ callback_(std::move(callback)),
+ local_path_(path) {
+ auto resource_request = std::make_unique<network::ResourceRequest>();
+ resource_request->url = url;
+ resource_request->credentials_mode = network::mojom::CredentialsMode::kOmit;
+ simple_url_loader_ = network::SimpleURLLoader::Create(
+ std::move(resource_request), traffic_annotation);
+ simple_url_loader_->SetRetryOptions(
+ kNumFileDownloaderRetries,
+ network::SimpleURLLoader::RetryMode::RETRY_ON_NETWORK_CHANGE);
+ if (overwrite) {
+ simple_url_loader_->DownloadToTempFile(
+ url_loader_factory_.get(),
+ base::BindOnce(&FileDownloader::OnSimpleDownloadComplete,
+ base::Unretained(this)));
+ } else {
+ base::PostTaskAndReplyWithResult(
+ base::CreateTaskRunner(
+ {base::ThreadPool(), base::MayBlock(),
+ base::TaskPriority::BEST_EFFORT,
+ base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN})
+ .get(),
+ FROM_HERE, base::Bind(&base::PathExists, local_path_),
+ base::Bind(&FileDownloader::OnFileExistsCheckDone,
+ weak_ptr_factory_.GetWeakPtr()));
+ }
+}
+
+FileDownloader::~FileDownloader() {}
+
+void FileDownloader::OnSimpleDownloadComplete(base::FilePath response_path) {
+ if (response_path.empty()) {
+ if (simple_url_loader_->ResponseInfo() &&
+ simple_url_loader_->ResponseInfo()->headers) {
+ int response_code =
+ simple_url_loader_->ResponseInfo()->headers->response_code();
+ DLOG(WARNING) << "HTTP error " << response_code
+ << " while trying to download "
+ << simple_url_loader_->GetFinalURL().spec();
+ }
+ std::move(callback_).Run(FAILED);
+ return;
+ }
+
+ base::PostTaskAndReplyWithResult(
+ base::CreateTaskRunner({base::ThreadPool(), base::MayBlock(),
+ base::TaskPriority::BEST_EFFORT,
+ base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN})
+ .get(),
+ FROM_HERE, base::Bind(&base::Move, response_path, local_path_),
+ base::Bind(&FileDownloader::OnFileMoveDone,
+ weak_ptr_factory_.GetWeakPtr()));
+}
+
+void FileDownloader::OnFileExistsCheckDone(bool exists) {
+ if (exists) {
+ std::move(callback_).Run(EXISTS);
+ } else {
+ simple_url_loader_->DownloadToTempFile(
+ url_loader_factory_.get(),
+ base::BindOnce(&FileDownloader::OnSimpleDownloadComplete,
+ base::Unretained(this)));
+ }
+}
+
+void FileDownloader::OnFileMoveDone(bool success) {
+ if (!success) {
+ DLOG(WARNING) << "Could not move file to "
+ << local_path_.LossyDisplayName();
+ }
+
+ std::move(callback_).Run(success ? DOWNLOADED : FAILED);
+}