| // Copyright 2020 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/ash/net/network_diagnostics/host_resolver.h" | 
 |  | 
 | #include <utility> | 
 |  | 
 | #include "base/bind.h" | 
 | #include "net/base/net_errors.h" | 
 | #include "net/base/network_anonymization_key.h" | 
 | #include "net/dns/public/dns_config_overrides.h" | 
 | #include "third_party/abseil-cpp/absl/types/optional.h" | 
 |  | 
 | namespace ash { | 
 | namespace network_diagnostics { | 
 |  | 
 | HostResolver::ResolutionResult::ResolutionResult( | 
 |     int result, | 
 |     const net::ResolveErrorInfo& resolve_error_info, | 
 |     const absl::optional<net::AddressList>& resolved_addresses, | 
 |     const absl::optional<net::HostResolverEndpointResults>& | 
 |         endpoint_results_with_metadata) | 
 |     : result(result), | 
 |       resolve_error_info(resolve_error_info), | 
 |       resolved_addresses(resolved_addresses), | 
 |       endpoint_results_with_metadata(endpoint_results_with_metadata) {} | 
 |  | 
 | HostResolver::ResolutionResult::~ResolutionResult() = default; | 
 |  | 
 | HostResolver::HostResolver(const net::HostPortPair& host_port_pair, | 
 |                            network::mojom::NetworkContext* network_context, | 
 |                            OnResolutionComplete callback) | 
 |     : callback_(std::move(callback)) { | 
 |   DCHECK(network_context); | 
 |   DCHECK(callback_); | 
 |  | 
 |   network_context->CreateHostResolver( | 
 |       net::DnsConfigOverrides(), host_resolver_.BindNewPipeAndPassReceiver()); | 
 |   // Disconnect handler will be invoked if the network service crashes. | 
 |   host_resolver_.set_disconnect_handler(base::BindOnce( | 
 |       &HostResolver::OnMojoConnectionError, base::Unretained(this))); | 
 |  | 
 |   network::mojom::ResolveHostParametersPtr parameters = | 
 |       network::mojom::ResolveHostParameters::New(); | 
 |   parameters->dns_query_type = net::DnsQueryType::A; | 
 |   parameters->source = net::HostResolverSource::DNS; | 
 |   parameters->cache_usage = | 
 |       network::mojom::ResolveHostParameters::CacheUsage::DISALLOWED; | 
 |  | 
 |   // Intentionally using a HostPortPair not to trigger ERR_DNS_NAME_HTTPS_ONLY | 
 |   // error while resolving http:// scheme host when a HTTPS resource record | 
 |   // exists. | 
 |   host_resolver_->ResolveHost( | 
 |       network::mojom::HostResolverHost::NewHostPortPair(host_port_pair), | 
 |       net::NetworkAnonymizationKey::CreateTransient(), std::move(parameters), | 
 |       receiver_.BindNewPipeAndPassRemote()); | 
 | } | 
 |  | 
 | HostResolver::~HostResolver() = default; | 
 |  | 
 | void HostResolver::OnComplete( | 
 |     int result, | 
 |     const net::ResolveErrorInfo& resolve_error_info, | 
 |     const absl::optional<net::AddressList>& resolved_addresses, | 
 |     const absl::optional<net::HostResolverEndpointResults>& | 
 |         endpoint_results_with_metadata) { | 
 |   receiver_.reset(); | 
 |   host_resolver_.reset(); | 
 |  | 
 |   ResolutionResult resolution_result{result, resolve_error_info, | 
 |                                      resolved_addresses, | 
 |                                      endpoint_results_with_metadata}; | 
 |   std::move(callback_).Run(resolution_result); | 
 | } | 
 |  | 
 | void HostResolver::OnMojoConnectionError() { | 
 |   OnComplete(net::ERR_NAME_NOT_RESOLVED, net::ResolveErrorInfo(net::ERR_FAILED), | 
 |              /*resolved_addresses=*/absl::nullopt, | 
 |              /*endpoint_results_with_metadata=*/absl::nullopt); | 
 | } | 
 |  | 
 | }  // namespace network_diagnostics | 
 | }  // namespace ash |