summaryrefslogtreecommitdiffstats
path: root/chrome/utility
diff options
context:
space:
mode:
authornoamsml@chromium.org <noamsml@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-08-24 15:31:36 +0000
committernoamsml@chromium.org <noamsml@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-08-24 15:31:36 +0000
commitb208cee69199afd0a01d71af94a4498919aa4f2f (patch)
tree754ee2e025af4424aea44a2a339698733c54ef0f /chrome/utility
parentb824b244b2c55a0c436304b0d5a50c643642e26b (diff)
downloadchromium_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')
-rw-r--r--chrome/utility/local_discovery/local_domain_resolver_unittest.cc56
-rw-r--r--chrome/utility/local_discovery/service_discovery_client_impl.cc52
-rw-r--r--chrome/utility/local_discovery/service_discovery_client_impl.h11
-rw-r--r--chrome/utility/local_discovery/service_discovery_message_handler.cc12
-rw-r--r--chrome/utility/local_discovery/service_discovery_message_handler.h3
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_;