Home | History | Annotate | Download | only in network
      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().
     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 
     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 
     44 DhcpProxyScriptFetcherChromeos::~DhcpProxyScriptFetcherChromeos() {
     45 }
     46 
     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 
     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 
     68 const GURL& DhcpProxyScriptFetcherChromeos::GetPacURL() const {
     69   return pac_url_;
     70 }
     71 
     72 std::string DhcpProxyScriptFetcherChromeos::GetFetcherName() const {
     73   return "chromeos";
     74 }
     75 
     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