13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// found in the LICENSE file. 43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chromeos/network/dhcp_proxy_script_fetcher_chromeos.h" 63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/task_runner_util.h" 83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chromeos/network/network_event_log.h" 93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chromeos/network/network_handler.h" 103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chromeos/network/network_state.h" 113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chromeos/network/network_state_handler.h" 123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "net/proxy/proxy_script_fetcher.h" 133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "net/proxy/proxy_script_fetcher_impl.h" 143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "net/url_request/url_request_context.h" 153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace chromeos { 173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace { 193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Runs on NetworkHandler::Get()->message_loop(). 213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)std::string GetPacUrlFromDefaultNetwork() { 223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!NetworkHandler::IsInitialized()) 233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return std::string(); 243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const NetworkState* default_network = 253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) NetworkHandler::Get()->network_state_handler()->DefaultNetwork(); 263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (default_network) 273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return default_network->web_proxy_auto_discovery_url().spec(); 283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return std::string(); 293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} // namespace 323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)DhcpProxyScriptFetcherChromeos::DhcpProxyScriptFetcherChromeos( 343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) net::URLRequestContext* url_request_context) 353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) : url_request_context_(url_request_context), 363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) weak_ptr_factory_(this) { 373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK(url_request_context_); 383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) proxy_script_fetcher_.reset( 393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) new net::ProxyScriptFetcherImpl(url_request_context_)); 403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (NetworkHandler::IsInitialized()) 413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) network_handler_message_loop_ = NetworkHandler::Get()->message_loop(); 423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)DhcpProxyScriptFetcherChromeos::~DhcpProxyScriptFetcherChromeos() { 453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)int DhcpProxyScriptFetcherChromeos::Fetch( 483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::string16* utf16_text, 493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const net::CompletionCallback& callback) { 503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!network_handler_message_loop_.get()) 513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return net::ERR_PAC_NOT_IN_DHCP; 52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CHECK(!callback.is_null()); 533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::PostTaskAndReplyWithResult( 543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) network_handler_message_loop_.get(), 553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) FROM_HERE, 563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::Bind(&GetPacUrlFromDefaultNetwork), 573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::Bind(&DhcpProxyScriptFetcherChromeos::ContinueFetch, 583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), utf16_text, callback)); 593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return net::ERR_IO_PENDING; 603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void DhcpProxyScriptFetcherChromeos::Cancel() { 633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) proxy_script_fetcher_->Cancel(); 64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Invalidate any pending callbacks (i.e. calls to ContinueFetch). 65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) weak_ptr_factory_.InvalidateWeakPtrs(); 663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const GURL& DhcpProxyScriptFetcherChromeos::GetPacURL() const { 693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return pac_url_; 703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)std::string DhcpProxyScriptFetcherChromeos::GetFetcherName() const { 733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return "chromeos"; 743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void DhcpProxyScriptFetcherChromeos::ContinueFetch( 773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::string16* utf16_text, 78d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) net::CompletionCallback callback, 793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string pac_url) { 803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) NET_LOG_EVENT("DhcpProxyScriptFetcher", pac_url); 813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) pac_url_ = GURL(pac_url); 823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (pac_url_.is_empty()) { 833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) callback.Run(net::ERR_PAC_NOT_IN_DHCP); 843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int res = proxy_script_fetcher_->Fetch(pac_url_, utf16_text, callback); 873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (res != net::ERR_IO_PENDING) 883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) callback.Run(res); 893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} // namespace chromeos 92