• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
16 namespace chromeos {
17 
18 namespace {
19 
20 // Runs on NetworkHandler::Get()->message_loop().
GetPacUrlFromDefaultNetwork()21 std::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 
DhcpProxyScriptFetcherChromeos(net::URLRequestContext * url_request_context)33 DhcpProxyScriptFetcherChromeos::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 
~DhcpProxyScriptFetcherChromeos()44 DhcpProxyScriptFetcherChromeos::~DhcpProxyScriptFetcherChromeos() {
45 }
46 
Fetch(base::string16 * utf16_text,const net::CompletionCallback & callback)47 int 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 
Cancel()62 void DhcpProxyScriptFetcherChromeos::Cancel() {
63   proxy_script_fetcher_->Cancel();
64   // Invalidate any pending callbacks (i.e. calls to ContinueFetch).
65   weak_ptr_factory_.InvalidateWeakPtrs();
66 }
67 
GetPacURL() const68 const GURL& DhcpProxyScriptFetcherChromeos::GetPacURL() const {
69   return pac_url_;
70 }
71 
GetFetcherName() const72 std::string DhcpProxyScriptFetcherChromeos::GetFetcherName() const {
73   return "chromeos";
74 }
75 
ContinueFetch(base::string16 * utf16_text,net::CompletionCallback callback,std::string pac_url)76 void 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