diff options
author | noamsml@chromium.org <noamsml@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-24 15:31:36 +0000 |
---|---|---|
committer | noamsml@chromium.org <noamsml@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-24 15:31:36 +0000 |
commit | b208cee69199afd0a01d71af94a4498919aa4f2f (patch) | |
tree | 754ee2e025af4424aea44a2a339698733c54ef0f /chrome/utility | |
parent | b824b244b2c55a0c436304b0d5a50c643642e26b (diff) | |
download | chromium_src-b208cee69199afd0a01d71af94a4498919aa4f2f.zip chromium_src-b208cee69199afd0a01d71af94a4498919aa4f2f.tar.gz chromium_src-b208cee69199afd0a01d71af94a4498919aa4f2f.tar.bz2 |
Make local domain resolver send both ipv4 and ipv6 addresses
Make local domain resolver send both ipv4 and ipv6 addresses, and make
the asynchronous HTTP factory prefer ipv4 to ipv6.
BUG=
Review URL: https://chromiumcodereview.appspot.com/23171031
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@219457 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/utility')
5 files changed, 99 insertions, 35 deletions
diff --git a/chrome/utility/local_discovery/local_domain_resolver_unittest.cc b/chrome/utility/local_discovery/local_domain_resolver_unittest.cc index 1dc9fc3..828af27 100644 --- a/chrome/utility/local_discovery/local_domain_resolver_unittest.cc +++ b/chrome/utility/local_discovery/local_domain_resolver_unittest.cc @@ -73,12 +73,17 @@ class LocalDomainResolverTest : public testing::Test { mdns_client_.StartListening(); } - void AddressCallback(bool resolved, const net::IPAddressNumber& address) { - if (address == net::IPAddressNumber()) { - AddressCallbackInternal(resolved, ""); - } else { - AddressCallbackInternal(resolved, net::IPAddressToString(address)); - } + std::string IPAddressToStringWithEmpty(const net::IPAddressNumber& address) { + if (address.empty()) return ""; + return net::IPAddressToString(address); + } + + void AddressCallback(bool resolved, + const net::IPAddressNumber& address_ipv4, + const net::IPAddressNumber& address_ipv6) { + AddressCallbackInternal(resolved, + IPAddressToStringWithEmpty(address_ipv4), + IPAddressToStringWithEmpty(address_ipv6)); } void RunFor(base::TimeDelta time_period) { @@ -92,8 +97,10 @@ class LocalDomainResolverTest : public testing::Test { callback.Cancel(); } - MOCK_METHOD2(AddressCallbackInternal, - void(bool resolved, std::string address)); + MOCK_METHOD3(AddressCallbackInternal, + void(bool resolved, + std::string address_ipv4, + std::string address_ipv6)); net::MockMDnsSocketFactory* socket_factory_; net::MDnsClientImpl mdns_client_; @@ -111,7 +118,7 @@ TEST_F(LocalDomainResolverTest, ResolveDomainA) { resolver.Start(); - EXPECT_CALL(*this, AddressCallbackInternal(true, "1.2.3.4")); + EXPECT_CALL(*this, AddressCallbackInternal(true, "1.2.3.4", "")); socket_factory_->SimulateReceive( kSamplePacketA, sizeof(kSamplePacketA)); @@ -128,13 +135,33 @@ TEST_F(LocalDomainResolverTest, ResolveDomainAAAA) { resolver.Start(); - EXPECT_CALL(*this, AddressCallbackInternal(true, "a::1:2:3:4")); + EXPECT_CALL(*this, AddressCallbackInternal(true, "", "a::1:2:3:4")); + + socket_factory_->SimulateReceive( + kSamplePacketAAAA, sizeof(kSamplePacketAAAA)); +} + +TEST_F(LocalDomainResolverTest, ResolveDomainAnyOneAvailable) { + LocalDomainResolverImpl resolver( + "myhello.local", net::ADDRESS_FAMILY_UNSPECIFIED, + base::Bind(&LocalDomainResolverTest::AddressCallback, + base::Unretained(this)), &mdns_client_); + + EXPECT_CALL(*socket_factory_, OnSendTo(_)) + .Times(4); // Twice per query + + resolver.Start(); socket_factory_->SimulateReceive( kSamplePacketAAAA, sizeof(kSamplePacketAAAA)); + + EXPECT_CALL(*this, AddressCallbackInternal(true, "", "a::1:2:3:4")); + + RunFor(base::TimeDelta::FromMilliseconds(150)); } -TEST_F(LocalDomainResolverTest, ResolveDomainAny) { + +TEST_F(LocalDomainResolverTest, ResolveDomainAnyBothAvailable) { LocalDomainResolverImpl resolver( "myhello.local", net::ADDRESS_FAMILY_UNSPECIFIED, base::Bind(&LocalDomainResolverTest::AddressCallback, @@ -145,10 +172,13 @@ TEST_F(LocalDomainResolverTest, ResolveDomainAny) { resolver.Start(); - EXPECT_CALL(*this, AddressCallbackInternal(true, "a::1:2:3:4")); + EXPECT_CALL(*this, AddressCallbackInternal(true, "1.2.3.4", "a::1:2:3:4")); socket_factory_->SimulateReceive( kSamplePacketAAAA, sizeof(kSamplePacketAAAA)); + + socket_factory_->SimulateReceive( + kSamplePacketA, sizeof(kSamplePacketA)); } TEST_F(LocalDomainResolverTest, ResolveDomainNone) { @@ -162,7 +192,7 @@ TEST_F(LocalDomainResolverTest, ResolveDomainNone) { resolver.Start(); - EXPECT_CALL(*this, AddressCallbackInternal(false, "")); + EXPECT_CALL(*this, AddressCallbackInternal(false, "", "")); RunFor(base::TimeDelta::FromSeconds(4)); } diff --git a/chrome/utility/local_discovery/service_discovery_client_impl.cc b/chrome/utility/local_discovery/service_discovery_client_impl.cc index 524f176..e8fc595 100644 --- a/chrome/utility/local_discovery/service_discovery_client_impl.cc +++ b/chrome/utility/local_discovery/service_discovery_client_impl.cc @@ -14,6 +14,12 @@ namespace local_discovery { +namespace { +// TODO(noamsml): Make this configurable through the LocalDomainResolver +// interface. +const int kLocalDomainSecondAddressTimeoutMs = 100; +} + ServiceDiscoveryClientImpl::ServiceDiscoveryClientImpl( net::MDnsClient* mdns_client) : mdns_client_(mdns_client) { } @@ -393,10 +399,11 @@ LocalDomainResolverImpl::LocalDomainResolverImpl( const IPAddressCallback& callback, net::MDnsClient* mdns_client) : domain_(domain), address_family_(address_family), callback_(callback), - transaction_failures_(0), mdns_client_(mdns_client) { + transactions_finished_(0), mdns_client_(mdns_client) { } LocalDomainResolverImpl::~LocalDomainResolverImpl() { + timeout_callback_.Cancel(); } void LocalDomainResolverImpl::Start() { @@ -425,31 +432,44 @@ scoped_ptr<net::MDnsTransaction> LocalDomainResolverImpl::CreateTransaction( void LocalDomainResolverImpl::OnTransactionComplete( net::MDnsTransaction::Result result, const net::RecordParsed* record) { - if (result != net::MDnsTransaction::RESULT_RECORD && - address_family_ == net::ADDRESS_FAMILY_UNSPECIFIED) { - transaction_failures_++; - - if (transaction_failures_ < 2) { - return; - } - } + transactions_finished_++; - transaction_a_.reset(); - transaction_aaaa_.reset(); - - net::IPAddressNumber address; if (result == net::MDnsTransaction::RESULT_RECORD) { if (record->type() == net::dns_protocol::kTypeA) { const net::ARecordRdata* rdata = record->rdata<net::ARecordRdata>(); - address = rdata->address(); + address_ipv4_ = rdata->address(); } else { DCHECK_EQ(net::dns_protocol::kTypeAAAA, record->type()); const net::AAAARecordRdata* rdata = record->rdata<net::AAAARecordRdata>(); - address = rdata->address(); + address_ipv6_ = rdata->address(); } } - callback_.Run(result == net::MDnsTransaction::RESULT_RECORD, address); + if (transactions_finished_ == 1 && + address_family_ == net::ADDRESS_FAMILY_UNSPECIFIED) { + timeout_callback_.Reset(base::Bind( + &LocalDomainResolverImpl::SendResolvedAddresses, + base::Unretained(this))); + + base::MessageLoop::current()->PostDelayedTask( + FROM_HERE, + timeout_callback_.callback(), + base::TimeDelta::FromMilliseconds(kLocalDomainSecondAddressTimeoutMs)); + } else if (transactions_finished_ == 2 + || address_family_ != net::ADDRESS_FAMILY_UNSPECIFIED) { + SendResolvedAddresses(); + } +} + +bool LocalDomainResolverImpl::IsSuccess() { + return !address_ipv4_.empty() || !address_ipv6_.empty(); +} + +void LocalDomainResolverImpl::SendResolvedAddresses() { + transaction_a_.reset(); + transaction_aaaa_.reset(); + timeout_callback_.Cancel(); + callback_.Run(IsSuccess(), address_ipv4_, address_ipv6_); } } // namespace local_discovery diff --git a/chrome/utility/local_discovery/service_discovery_client_impl.h b/chrome/utility/local_discovery/service_discovery_client_impl.h index f04f3112..efe0d43 100644 --- a/chrome/utility/local_discovery/service_discovery_client_impl.h +++ b/chrome/utility/local_discovery/service_discovery_client_impl.h @@ -212,6 +212,10 @@ class LocalDomainResolverImpl : public LocalDomainResolver { scoped_ptr<net::MDnsTransaction> CreateTransaction(uint16 type); + bool IsSuccess(); + + void SendResolvedAddresses(); + std::string domain_; net::AddressFamily address_family_; IPAddressCallback callback_; @@ -219,10 +223,15 @@ class LocalDomainResolverImpl : public LocalDomainResolver { scoped_ptr<net::MDnsTransaction> transaction_a_; scoped_ptr<net::MDnsTransaction> transaction_aaaa_; - int transaction_failures_; + int transactions_finished_; net::MDnsClient* mdns_client_; + net::IPAddressNumber address_ipv4_; + net::IPAddressNumber address_ipv6_; + + base::CancelableCallback<void()> timeout_callback_; + DISALLOW_COPY_AND_ASSIGN(LocalDomainResolverImpl); }; diff --git a/chrome/utility/local_discovery/service_discovery_message_handler.cc b/chrome/utility/local_discovery/service_discovery_message_handler.cc index e6c84dd..d506c2b 100644 --- a/chrome/utility/local_discovery/service_discovery_message_handler.cc +++ b/chrome/utility/local_discovery/service_discovery_message_handler.cc @@ -135,10 +135,11 @@ void SendServiceUpdated(uint64 id, ServiceWatcher::UpdateType update, } void SendLocalDomainResolved(uint64 id, bool success, - const net::IPAddressNumber& address) { + const net::IPAddressNumber& address_ipv4, + const net::IPAddressNumber& address_ipv6) { content::UtilityThread::Get()->Send( new LocalDiscoveryHostMsg_LocalDomainResolverCallback( - id, success, address)); + id, success, address_ipv4, address_ipv6)); } } // namespace @@ -381,10 +382,13 @@ void ServiceDiscoveryMessageHandler::OnServiceResolved( void ServiceDiscoveryMessageHandler::OnLocalDomainResolved( uint64 id, bool success, - const net::IPAddressNumber& address) { + const net::IPAddressNumber& address_ipv4, + const net::IPAddressNumber& address_ipv6) { DCHECK(service_discovery_client_); utility_task_runner_->PostTask(FROM_HERE, base::Bind(&SendLocalDomainResolved, - id, success, address)); + id, success, + address_ipv4, + address_ipv6)); } diff --git a/chrome/utility/local_discovery/service_discovery_message_handler.h b/chrome/utility/local_discovery/service_discovery_message_handler.h index 35c6b03..917d525 100644 --- a/chrome/utility/local_discovery/service_discovery_message_handler.h +++ b/chrome/utility/local_discovery/service_discovery_message_handler.h @@ -87,7 +87,8 @@ class ServiceDiscoveryMessageHandler : public chrome::UtilityMessageHandler { // Is called by LocalDomainResolver as callback. void OnLocalDomainResolved(uint64 id, bool success, - const net::IPAddressNumber& address); + const net::IPAddressNumber& address_ipv4, + const net::IPAddressNumber& address_ipv6); ServiceWatchers service_watchers_; ServiceResolvers service_resolvers_; |