| Index: chrome/browser/net/dns_probe_job.cc
|
| diff --git a/chrome/browser/net/dns_probe_job.cc b/chrome/browser/net/dns_probe_job.cc
|
| deleted file mode 100644
|
| index f51f450e7c2d9e16314facac95b318d436d2f5b5..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/net/dns_probe_job.cc
|
| +++ /dev/null
|
| @@ -1,236 +0,0 @@
|
| -// Copyright (c) 2012 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 "chrome/browser/net/dns_probe_job.h"
|
| -
|
| -#include "base/compiler_specific.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/memory/weak_ptr.h"
|
| -#include "base/message_loop.h"
|
| -#include "base/time/time.h"
|
| -#include "net/base/address_list.h"
|
| -#include "net/base/net_errors.h"
|
| -#include "net/base/net_log.h"
|
| -#include "net/dns/dns_client.h"
|
| -#include "net/dns/dns_protocol.h"
|
| -#include "net/dns/dns_response.h"
|
| -#include "net/dns/dns_transaction.h"
|
| -
|
| -using base::TimeDelta;
|
| -using net::AddressList;
|
| -using net::BoundNetLog;
|
| -using net::DnsClient;
|
| -using net::DnsResponse;
|
| -using net::DnsTransaction;
|
| -using net::NetLog;
|
| -
|
| -namespace chrome_browser_net {
|
| -
|
| -namespace {
|
| -
|
| -// Returns true if the given net_error indicates that we received a response
|
| -// from the DNS server containing an error, or false if the given net_error
|
| -// indicates that we never received a response.
|
| -bool DidReceiveDnsResponse(int net_error) {
|
| - switch (net_error) {
|
| - case net::ERR_NAME_NOT_RESOLVED: // NXDOMAIN maps to this.
|
| - case net::ERR_DNS_MALFORMED_RESPONSE:
|
| - case net::ERR_DNS_SERVER_REQUIRES_TCP:
|
| - case net::ERR_DNS_SERVER_FAILED:
|
| - case net::ERR_DNS_SORT_ERROR: // Can only happen if the server responds.
|
| - return true;
|
| - default:
|
| - return false;
|
| - }
|
| -}
|
| -
|
| -class DnsProbeJobImpl : public DnsProbeJob {
|
| - public:
|
| - DnsProbeJobImpl(scoped_ptr<DnsClient> dns_client,
|
| - const DnsProbeJob::CallbackType& callback,
|
| - NetLog* net_log);
|
| - virtual ~DnsProbeJobImpl();
|
| -
|
| - private:
|
| - enum QueryResult {
|
| - QUERY_UNKNOWN,
|
| - QUERY_CORRECT,
|
| - QUERY_INCORRECT,
|
| - QUERY_DNS_ERROR,
|
| - QUERY_NET_ERROR,
|
| - };
|
| -
|
| - void Start();
|
| -
|
| - scoped_ptr<DnsTransaction> CreateTransaction(
|
| - const std::string& hostname);
|
| - void StartTransaction(DnsTransaction* transaction);
|
| - // Checks that |net_error| is OK, |response| parses, and has at least one
|
| - // address.
|
| - QueryResult EvaluateGoodResponse(int net_error, const DnsResponse* response);
|
| - // Checks that |net_error| is OK, |response| parses but has no addresses.
|
| - QueryResult EvaluateBadResponse(int net_error, const DnsResponse* response);
|
| - DnsProbeJob::Result EvaluateQueryResults();
|
| - void OnTransactionComplete(DnsTransaction* transaction,
|
| - int net_error,
|
| - const DnsResponse* response);
|
| -
|
| - BoundNetLog bound_net_log_;
|
| - scoped_ptr<DnsClient> dns_client_;
|
| - const DnsProbeJob::CallbackType callback_;
|
| - scoped_ptr<DnsTransaction> good_transaction_;
|
| - scoped_ptr<DnsTransaction> bad_transaction_;
|
| - bool good_running_;
|
| - bool bad_running_;
|
| - QueryResult good_result_;
|
| - QueryResult bad_result_;
|
| - base::WeakPtrFactory<DnsProbeJobImpl> weak_factory_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(DnsProbeJobImpl);
|
| -};
|
| -
|
| -DnsProbeJobImpl::DnsProbeJobImpl(scoped_ptr<DnsClient> dns_client,
|
| - const DnsProbeJob::CallbackType& callback,
|
| - NetLog* net_log)
|
| - : bound_net_log_(
|
| - BoundNetLog::Make(net_log, NetLog::SOURCE_DNS_PROBER)),
|
| - dns_client_(dns_client.Pass()),
|
| - callback_(callback),
|
| - good_running_(false),
|
| - bad_running_(false),
|
| - good_result_(QUERY_UNKNOWN),
|
| - bad_result_(QUERY_UNKNOWN),
|
| - weak_factory_(this) {
|
| - DCHECK(dns_client_.get());
|
| - DCHECK(dns_client_->GetConfig());
|
| -
|
| - base::MessageLoop::current()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&DnsProbeJobImpl::Start,
|
| - weak_factory_.GetWeakPtr()));
|
| -}
|
| -
|
| -DnsProbeJobImpl::~DnsProbeJobImpl() {
|
| -}
|
| -
|
| -void DnsProbeJobImpl::Start() {
|
| - // TODO(ttuttle): Pick a good random hostname for the bad case.
|
| - // Consider running transactions in series?
|
| - good_transaction_ = CreateTransaction("google.com");
|
| - bad_transaction_ = CreateTransaction("thishostname.doesnotresolve");
|
| -
|
| - // StartTransaction may call the callback synchrononously, so set these
|
| - // before we call it.
|
| - good_running_ = true;
|
| - bad_running_ = true;
|
| -
|
| - // TODO(ttuttle): Log probe started.
|
| -
|
| - StartTransaction(good_transaction_.get());
|
| - StartTransaction(bad_transaction_.get());
|
| -}
|
| -
|
| -scoped_ptr<DnsTransaction> DnsProbeJobImpl::CreateTransaction(
|
| - const std::string& hostname) {
|
| - return dns_client_->GetTransactionFactory()->CreateTransaction(
|
| - hostname,
|
| - net::dns_protocol::kTypeA,
|
| - base::Bind(&DnsProbeJobImpl::OnTransactionComplete,
|
| - base::Unretained(this)),
|
| - bound_net_log_);
|
| -}
|
| -
|
| -void DnsProbeJobImpl::StartTransaction(DnsTransaction* transaction) {
|
| - int rv = transaction->Start();
|
| - if (rv != net::ERR_IO_PENDING) {
|
| - // TODO(ttuttle): Make sure this counts as unreachable, not error.
|
| - OnTransactionComplete(transaction, rv, NULL);
|
| - }
|
| -
|
| - // TODO(ttuttle): Log transaction started.
|
| -}
|
| -
|
| -DnsProbeJobImpl::QueryResult DnsProbeJobImpl::EvaluateGoodResponse(
|
| - int net_error,
|
| - const DnsResponse* response) {
|
| - if (net_error != net::OK)
|
| - return DidReceiveDnsResponse(net_error) ? QUERY_DNS_ERROR : QUERY_NET_ERROR;
|
| -
|
| - AddressList addr_list;
|
| - TimeDelta ttl;
|
| - DnsResponse::Result result = response->ParseToAddressList(&addr_list, &ttl);
|
| -
|
| - if (result != DnsResponse::DNS_PARSE_OK)
|
| - return QUERY_DNS_ERROR;
|
| -
|
| - if (addr_list.empty())
|
| - return QUERY_INCORRECT;
|
| -
|
| - return QUERY_CORRECT;
|
| -}
|
| -
|
| -DnsProbeJobImpl::QueryResult DnsProbeJobImpl::EvaluateBadResponse(
|
| - int net_error,
|
| - const DnsResponse* response) {
|
| - if (net_error == net::ERR_NAME_NOT_RESOLVED) // NXDOMAIN maps to this
|
| - return QUERY_CORRECT;
|
| -
|
| - if (net_error != net::OK)
|
| - return DidReceiveDnsResponse(net_error) ? QUERY_DNS_ERROR : QUERY_NET_ERROR;
|
| -
|
| - return QUERY_INCORRECT;
|
| -}
|
| -
|
| -DnsProbeJob::Result DnsProbeJobImpl::EvaluateQueryResults() {
|
| - if (good_result_ == QUERY_NET_ERROR || bad_result_ == QUERY_NET_ERROR)
|
| - return SERVERS_UNREACHABLE;
|
| -
|
| - if (good_result_ == QUERY_DNS_ERROR || bad_result_ == QUERY_DNS_ERROR)
|
| - return SERVERS_FAILING;
|
| -
|
| - // Ignore incorrect responses to known-bad query to avoid flagging domain
|
| - // helpers.
|
| - if (good_result_ == QUERY_INCORRECT)
|
| - return SERVERS_INCORRECT;
|
| -
|
| - return SERVERS_CORRECT;
|
| -}
|
| -
|
| -void DnsProbeJobImpl::OnTransactionComplete(DnsTransaction* transaction,
|
| - int net_error,
|
| - const DnsResponse* response) {
|
| - if (transaction == good_transaction_.get()) {
|
| - DCHECK(good_running_);
|
| - DCHECK_EQ(QUERY_UNKNOWN, good_result_);
|
| - good_result_ = EvaluateGoodResponse(net_error, response);
|
| - good_running_ = false;
|
| - } else if (transaction == bad_transaction_.get()) {
|
| - DCHECK(bad_running_);
|
| - DCHECK_EQ(QUERY_UNKNOWN, bad_result_);
|
| - bad_result_ = EvaluateBadResponse(net_error, response);
|
| - bad_running_ = false;
|
| - } else {
|
| - NOTREACHED();
|
| - return;
|
| - }
|
| -
|
| - if (good_running_ || bad_running_)
|
| - return;
|
| -
|
| - callback_.Run(this, EvaluateQueryResults());
|
| -
|
| - // TODO(ttuttle): Log probe finished.
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -scoped_ptr<DnsProbeJob> DnsProbeJob::CreateJob(
|
| - scoped_ptr<DnsClient> dns_client,
|
| - const CallbackType& callback,
|
| - NetLog* net_log) {
|
| - return scoped_ptr<DnsProbeJob>(
|
| - new DnsProbeJobImpl(dns_client.Pass(), callback, net_log));
|
| -}
|
| -
|
| -} // namespace chrome_browser_net
|
|
|