| // Copyright 2015 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/local_discovery/endpoint_resolver.h" |
| |
| #include "base/command_line.h" |
| #include "base/debug/dump_without_crashing.h" |
| #include "base/functional/bind.h" |
| #include "build/build_config.h" |
| #include "chrome/browser/local_discovery/service_discovery_shared_client.h" |
| #include "chrome/common/chrome_switches.h" |
| #include "net/base/ip_address.h" |
| #include "net/base/ip_endpoint.h" |
| |
| namespace local_discovery { |
| |
| EndpointResolver::EndpointResolver() { |
| service_discovery_client_ = ServiceDiscoverySharedClient::GetInstance(); |
| } |
| |
| EndpointResolver::~EndpointResolver() {} |
| |
| void EndpointResolver::Start(const net::HostPortPair& address, |
| ResultCallback callback) { |
| #if BUILDFLAG(IS_MAC) |
| net::IPAddress ip_address; |
| if (!ip_address.AssignFromIPLiteral(address.host())) { |
| NOTREACHED() << address.ToString(); |
| // Unexpected, but could be a reason for crbug.com/513505 |
| base::debug::DumpWithoutCrashing(); |
| return std::move(callback).Run(net::IPEndPoint()); |
| } |
| |
| // OSX already has IP there. |
| std::move(callback).Run(net::IPEndPoint(ip_address, address.port())); |
| #else // BUILDFLAG(IS_MAC) |
| net::AddressFamily address_family = net::ADDRESS_FAMILY_UNSPECIFIED; |
| if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| switches::kPrivetIPv6Only)) { |
| address_family = net::ADDRESS_FAMILY_IPV6; |
| } |
| |
| domain_resolver_ = service_discovery_client_->CreateLocalDomainResolver( |
| address.host(), address_family, |
| base::BindOnce(&EndpointResolver::DomainResolveComplete, |
| base::Unretained(this), address.port(), |
| std::move(callback))); |
| domain_resolver_->Start(); |
| #endif // BUILDFLAG(IS_MAC) |
| } |
| |
| void EndpointResolver::DomainResolveComplete( |
| uint16_t port, |
| ResultCallback callback, |
| bool success, |
| const net::IPAddress& address_ipv4, |
| const net::IPAddress& address_ipv6) { |
| if (!success) |
| return std::move(callback).Run(net::IPEndPoint()); |
| |
| net::IPAddress address = address_ipv4; |
| if (!address.IsValid()) |
| address = address_ipv6; |
| |
| DCHECK(address.IsValid()); |
| |
| std::move(callback).Run(net::IPEndPoint(address, port)); |
| } |
| |
| } // namespace local_discovery |