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