Popular sites on the NTP: re-download popular suggestions once per Chrome run
[chromium-blink-merge.git] / chrome / browser / net / file_downloader.cc
blob1b5c2c26c28c5d61b621559ae644125f74093fad
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/net/file_downloader.h"
7 #include "base/bind.h"
8 #include "base/files/file_path.h"
9 #include "base/files/file_util.h"
10 #include "base/logging.h"
11 #include "content/public/browser/browser_thread.h"
12 #include "net/base/load_flags.h"
13 #include "net/http/http_status_code.h"
14 #include "net/url_request/url_fetcher.h"
15 #include "url/gurl.h"
17 using content::BrowserThread;
18 using net::URLFetcher;
20 const int kNumRetries = 1;
22 FileDownloader::FileDownloader(const GURL& url,
23 const base::FilePath& path,
24 bool overwrite,
25 net::URLRequestContextGetter* request_context,
26 const DownloadFinishedCallback& callback)
27 : callback_(callback),
28 fetcher_(URLFetcher::Create(url, URLFetcher::GET, this)),
29 weak_ptr_factory_(this) {
30 fetcher_->SetRequestContext(request_context);
31 fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SEND_COOKIES |
32 net::LOAD_DO_NOT_SAVE_COOKIES);
33 fetcher_->SetAutomaticallyRetryOnNetworkChanges(kNumRetries);
34 fetcher_->SaveResponseToFileAtPath(
35 path,
36 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE));
38 if (overwrite) {
39 fetcher_->Start();
40 } else {
41 base::PostTaskAndReplyWithResult(
42 BrowserThread::GetBlockingPool()->GetTaskRunnerWithShutdownBehavior(
43 base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN).get(),
44 FROM_HERE,
45 base::Bind(&base::PathExists, path),
46 base::Bind(&FileDownloader::OnFileExistsCheckDone,
47 weak_ptr_factory_.GetWeakPtr()));
51 FileDownloader::~FileDownloader() {}
53 void FileDownloader::OnURLFetchComplete(const net::URLFetcher* source) {
54 DCHECK_EQ(fetcher_.get(), source);
55 // Delete |fetcher_| when we leave this method. This is necessary so the
56 // download file will be deleted if the download failed.
57 scoped_ptr<net::URLFetcher> fetcher(fetcher_.Pass());
59 const net::URLRequestStatus& status = source->GetStatus();
60 if (!status.is_success()) {
61 DLOG(WARNING) << "URLRequestStatus error " << status.error()
62 << " while trying to download " << source->GetURL().spec();
63 callback_.Run(false);
64 return;
67 int response_code = source->GetResponseCode();
68 if (response_code != net::HTTP_OK) {
69 DLOG(WARNING) << "HTTP error " << response_code
70 << " while trying to download " << source->GetURL().spec();
71 callback_.Run(false);
72 return;
75 // Take ownership of the new file.
76 base::FilePath response_path;
77 bool success = source->GetResponseAsFilePath(true, &response_path);
78 callback_.Run(success);
81 void FileDownloader::OnFileExistsCheckDone(bool exists) {
82 if (exists)
83 callback_.Run(true);
84 else
85 fetcher_->Start();