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