supervised_user_blacklist_downloader.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
1// Copyright 2014 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.
4
5#include "chrome/browser/supervised_user/experimental/supervised_user_blacklist_downloader.h"
6
7#include "base/files/file_path.h"
8#include "base/files/file_util.h"
9#include "base/logging.h"
10#include "content/public/browser/browser_thread.h"
11#include "net/base/load_flags.h"
12#include "net/http/http_status_code.h"
13#include "net/url_request/url_fetcher.h"
14#include "url/gurl.h"
15
16using content::BrowserThread;
17using net::URLFetcher;
18
19const int kNumRetries = 1;
20
21SupervisedUserBlacklistDownloader::SupervisedUserBlacklistDownloader(
22    const GURL& url,
23    const base::FilePath& path,
24    net::URLRequestContextGetter* request_context,
25    const DownloadFinishedCallback& callback)
26    : callback_(callback),
27      fetcher_(URLFetcher::Create(url, URLFetcher::GET, this)),
28      weak_ptr_factory_(this) {
29  fetcher_->SetRequestContext(request_context);
30  fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SEND_COOKIES |
31                         net::LOAD_DO_NOT_SAVE_COOKIES |
32                         net::LOAD_IS_DOWNLOAD);
33  fetcher_->SetAutomaticallyRetryOnNetworkChanges(kNumRetries);
34  fetcher_->SaveResponseToFileAtPath(
35      path,
36      BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE));
37
38  base::PostTaskAndReplyWithResult(
39      BrowserThread::GetBlockingPool(),
40      FROM_HERE,
41      base::Bind(&base::PathExists, path),
42      base::Bind(&SupervisedUserBlacklistDownloader::OnFileExistsCheckDone,
43                 weak_ptr_factory_.GetWeakPtr()));
44}
45
46SupervisedUserBlacklistDownloader::~SupervisedUserBlacklistDownloader() {}
47
48void SupervisedUserBlacklistDownloader::OnURLFetchComplete(
49    const net::URLFetcher* source) {
50  DCHECK_EQ(fetcher_.get(), source);
51
52  const net::URLRequestStatus& status = source->GetStatus();
53  if (!status.is_success()) {
54    DLOG(WARNING) << "URLRequestStatus error " << status.error();
55    callback_.Run(false);
56    return;
57  }
58
59  int response_code = source->GetResponseCode();
60  if (response_code != net::HTTP_OK) {
61    DLOG(WARNING) << "HTTP error " << response_code;
62    callback_.Run(false);
63    return;
64  }
65
66  // Take ownership of the new file.
67  base::FilePath response_path;
68  bool success = source->GetResponseAsFilePath(true, &response_path);
69  callback_.Run(success);
70}
71
72void SupervisedUserBlacklistDownloader::OnFileExistsCheckDone(bool exists) {
73  if (exists) {
74    // TODO(treib): Figure out a strategy for updating the file.
75    callback_.Run(true);
76  } else {
77    fetcher_->Start();
78  }
79}
80