blob: 8644c4ffba33856eaae269606d3ee4aafdc8fb6f [file] [log] [blame]
// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chromeos/network/dhcp_pac_file_fetcher_chromeos.h"
#include "base/bind.h"
#include "base/location.h"
#include "base/task_runner_util.h"
#include "chromeos/network/network_event_log.h"
#include "chromeos/network/network_handler.h"
#include "chromeos/network/network_state.h"
#include "chromeos/network/network_state_handler.h"
#include "net/proxy_resolution/pac_file_fetcher.h"
#include "net/proxy_resolution/pac_file_fetcher_impl.h"
#include "net/url_request/url_request_context.h"
namespace chromeos {
namespace {
// Runs on NetworkHandler::Get()->message_loop().
std::string GetPacUrlFromDefaultNetwork() {
if (!NetworkHandler::IsInitialized())
return std::string();
const NetworkState* default_network =
NetworkHandler::Get()->network_state_handler()->DefaultNetwork();
if (default_network)
return default_network->GetWebProxyAutoDiscoveryUrl().spec();
return std::string();
}
} // namespace
DhcpPacFileFetcherChromeos::DhcpPacFileFetcherChromeos(
net::URLRequestContext* url_request_context)
: weak_ptr_factory_(this) {
DCHECK(url_request_context);
pac_file_fetcher_ = net::PacFileFetcherImpl::Create(url_request_context);
if (NetworkHandler::IsInitialized())
network_handler_task_runner_ = NetworkHandler::Get()->task_runner();
}
DhcpPacFileFetcherChromeos::~DhcpPacFileFetcherChromeos() = default;
int DhcpPacFileFetcherChromeos::Fetch(
base::string16* utf16_text,
net::CompletionOnceCallback callback,
const net::NetLogWithSource& net_log,
const net::NetworkTrafficAnnotationTag traffic_annotation) {
if (!network_handler_task_runner_.get())
return net::ERR_PAC_NOT_IN_DHCP;
CHECK(callback);
// DhcpPacFileFetcher only allows one Fetch in progress at a time.
CHECK(!callback_);
callback_ = std::move(callback);
base::PostTaskAndReplyWithResult(
network_handler_task_runner_.get(), FROM_HERE,
base::BindOnce(&GetPacUrlFromDefaultNetwork),
base::BindOnce(&DhcpPacFileFetcherChromeos::ContinueFetch,
weak_ptr_factory_.GetWeakPtr(), utf16_text,
traffic_annotation));
return net::ERR_IO_PENDING;
}
void DhcpPacFileFetcherChromeos::Cancel() {
callback_.Reset();
pac_file_fetcher_->Cancel();
// Invalidate any pending callbacks (i.e. calls to ContinueFetch).
weak_ptr_factory_.InvalidateWeakPtrs();
}
void DhcpPacFileFetcherChromeos::OnShutdown() {
callback_.Reset();
pac_file_fetcher_->OnShutdown();
}
const GURL& DhcpPacFileFetcherChromeos::GetPacURL() const {
return pac_url_;
}
std::string DhcpPacFileFetcherChromeos::GetFetcherName() const {
return "chromeos";
}
void DhcpPacFileFetcherChromeos::ContinueFetch(
base::string16* utf16_text,
const net::NetworkTrafficAnnotationTag traffic_annotation,
std::string pac_url) {
NET_LOG_EVENT("DhcpPacFileFetcher", pac_url);
pac_url_ = GURL(pac_url);
if (pac_url_.is_empty()) {
std::move(callback_).Run(net::ERR_PAC_NOT_IN_DHCP);
return;
}
int result = pac_file_fetcher_->Fetch(
pac_url_, utf16_text,
base::BindOnce(&DhcpPacFileFetcherChromeos::OnFetchCompleted,
weak_ptr_factory_.GetWeakPtr()),
traffic_annotation);
if (result != net::ERR_IO_PENDING)
std::move(callback_).Run(result);
}
void DhcpPacFileFetcherChromeos::OnFetchCompleted(int result) {
std::move(callback_).Run(result);
}
} // namespace chromeos