diff options
author | szym@chromium.org <szym@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-14 19:09:27 +0000 |
---|---|---|
committer | szym@chromium.org <szym@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-14 19:09:27 +0000 |
commit | 78eac2a2edb56ad0bd2714ab62154e5848f0d91d (patch) | |
tree | 3ccdb2c487753f6d279a26a1031ef5749f6a9fc1 /net/dns/dns_client.cc | |
parent | ecded430294087b94b1d5fc2da55a8dd20aee19b (diff) | |
download | chromium_src-78eac2a2edb56ad0bd2714ab62154e5848f0d91d.zip chromium_src-78eac2a2edb56ad0bd2714ab62154e5848f0d91d.tar.gz chromium_src-78eac2a2edb56ad0bd2714ab62154e5848f0d91d.tar.bz2 |
[net/dns] Serve requests from HOSTS file if possible.
If the DnsConfig is available, we can serve the requests synchronously in Resolve. However, we might not receive the DnsConfig until the Job is placed in the queue. In that case, we attempt to serve the jobs once DnsConfig is available.
BUG=114826
TEST=./net_unittests --gtest_filter=HostResolverImplTest.ServeFromHosts
Original review: https://chromiumcodereview.appspot.com/9667025/
Review URL: http://codereview.chromium.org/9705017
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@126697 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/dns/dns_client.cc')
-rw-r--r-- | net/dns/dns_client.cc | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/net/dns/dns_client.cc b/net/dns/dns_client.cc new file mode 100644 index 0000000..5381452 --- /dev/null +++ b/net/dns/dns_client.cc @@ -0,0 +1,58 @@ +// 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 "net/dns/dns_client.h" + +#include "base/bind.h" +#include "base/rand_util.h" +#include "net/base/net_log.h" +#include "net/dns/dns_config_service.h" +#include "net/dns/dns_session.h" +#include "net/dns/dns_transaction.h" +#include "net/socket/client_socket_factory.h" + +namespace net { + +namespace { + +class DnsClientImpl : public DnsClient { + public: + explicit DnsClientImpl(NetLog* net_log) : net_log_(net_log) {} + + virtual void SetConfig(const DnsConfig& config) OVERRIDE { + factory_.reset(); + session_.release(); + if (config.IsValid()) { + session_ = new DnsSession(config, + ClientSocketFactory::GetDefaultFactory(), + base::Bind(&base::RandInt), + net_log_); + factory_ = DnsTransactionFactory::CreateFactory(session_); + } + } + + virtual const DnsConfig* GetConfig() const OVERRIDE { + return session_.get() ? &session_->config() : NULL; + } + + virtual DnsTransactionFactory* GetTransactionFactory() OVERRIDE { + return session_.get() ? factory_.get() : NULL; + } + + private: + scoped_refptr<DnsSession> session_; + scoped_ptr<DnsTransactionFactory> factory_; + + NetLog* net_log_; +}; + +} // namespace + +// static +scoped_ptr<DnsClient> DnsClient::CreateClient(NetLog* net_log) { + return scoped_ptr<DnsClient>(new DnsClientImpl(net_log)); +} + +} // namespace net + |