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