dhcp_proxy_script_fetcher_chromeos.cc revision d0247b1b59f9c528cb6df88b4f2b9afaf80d181e
1// Copyright (c) 2013 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 "chromeos/network/dhcp_proxy_script_fetcher_chromeos.h"
6
7#include "base/task_runner_util.h"
8#include "chromeos/network/network_event_log.h"
9#include "chromeos/network/network_handler.h"
10#include "chromeos/network/network_state.h"
11#include "chromeos/network/network_state_handler.h"
12#include "net/proxy/proxy_script_fetcher.h"
13#include "net/proxy/proxy_script_fetcher_impl.h"
14#include "net/url_request/url_request_context.h"
15
16namespace chromeos {
17
18namespace {
19
20// Runs on NetworkHandler::Get()->message_loop().
21std::string GetPacUrlFromDefaultNetwork() {
22  if (!NetworkHandler::IsInitialized())
23    return std::string();
24  const NetworkState* default_network =
25      NetworkHandler::Get()->network_state_handler()->DefaultNetwork();
26  if (default_network)
27    return default_network->web_proxy_auto_discovery_url().spec();
28  return std::string();
29}
30
31}  // namespace
32
33DhcpProxyScriptFetcherChromeos::DhcpProxyScriptFetcherChromeos(
34    net::URLRequestContext* url_request_context)
35    : url_request_context_(url_request_context),
36      weak_ptr_factory_(this) {
37  DCHECK(url_request_context_);
38  proxy_script_fetcher_.reset(
39      new net::ProxyScriptFetcherImpl(url_request_context_));
40  if (NetworkHandler::IsInitialized())
41    network_handler_message_loop_ = NetworkHandler::Get()->message_loop();
42}
43
44DhcpProxyScriptFetcherChromeos::~DhcpProxyScriptFetcherChromeos() {
45}
46
47int DhcpProxyScriptFetcherChromeos::Fetch(
48    base::string16* utf16_text,
49    const net::CompletionCallback& callback) {
50  if (!network_handler_message_loop_.get())
51    return net::ERR_PAC_NOT_IN_DHCP;
52  CHECK(!callback.is_null());
53  base::PostTaskAndReplyWithResult(
54      network_handler_message_loop_.get(),
55      FROM_HERE,
56      base::Bind(&GetPacUrlFromDefaultNetwork),
57      base::Bind(&DhcpProxyScriptFetcherChromeos::ContinueFetch,
58                 weak_ptr_factory_.GetWeakPtr(), utf16_text, callback));
59  return net::ERR_IO_PENDING;
60}
61
62void DhcpProxyScriptFetcherChromeos::Cancel() {
63  proxy_script_fetcher_->Cancel();
64  // Invalidate any pending callbacks (i.e. calls to ContinueFetch).
65  weak_ptr_factory_.InvalidateWeakPtrs();
66}
67
68const GURL& DhcpProxyScriptFetcherChromeos::GetPacURL() const {
69  return pac_url_;
70}
71
72std::string DhcpProxyScriptFetcherChromeos::GetFetcherName() const {
73  return "chromeos";
74}
75
76void DhcpProxyScriptFetcherChromeos::ContinueFetch(
77    base::string16* utf16_text,
78    net::CompletionCallback callback,
79    std::string pac_url) {
80  NET_LOG_EVENT("DhcpProxyScriptFetcher", pac_url);
81  pac_url_ = GURL(pac_url);
82  if (pac_url_.is_empty()) {
83    callback.Run(net::ERR_PAC_NOT_IN_DHCP);
84    return;
85  }
86  int res = proxy_script_fetcher_->Fetch(pac_url_, utf16_text, callback);
87  if (res != net::ERR_IO_PENDING)
88    callback.Run(res);
89}
90
91}  // namespace chromeos
92