blob: f4bed4bda45de84c9af48349408eb83b3e7c58b7 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/webid/delegation/dns_request.h"
#include "base/strings/string_split.h"
#include "net/base/net_errors.h"
#include "net/dns/public/dns_query_type.h"
#include "services/network/public/mojom/host_resolver.mojom.h"
#include "services/network/public/mojom/network_context.mojom.h"
#include "url/scheme_host_port.h"
namespace content::webid {
DnsRequest::DnsRequest(network::NetworkContextGetter network_context_getter)
: network_context_getter_(std::move(network_context_getter)) {}
DnsRequest::~DnsRequest() = default;
void DnsRequest::SendRequest(const std::string& hostname,
DnsRequestCallback callback) {
callback_ = std::move(callback);
network::mojom::ResolveHostParametersPtr parameters =
network::mojom::ResolveHostParameters::New();
parameters->dns_query_type = net::DnsQueryType::TXT;
parameters->cache_usage =
network::mojom::ResolveHostParameters::CacheUsage::DISALLOWED;
auto* network_context = network_context_getter_.Run();
if (!network_context) {
std::move(callback_).Run(std::nullopt);
return;
}
network_context->CreateHostResolver(
std::nullopt, host_resolver_.BindNewPipeAndPassReceiver());
host_resolver_->ResolveHost(network::mojom::HostResolverHost::NewHostPortPair(
net::HostPortPair(hostname, 0)),
net::NetworkAnonymizationKey(),
std::move(parameters),
receiver_.BindNewPipeAndPassRemote());
}
void DnsRequest::OnComplete(
int result,
const net::ResolveErrorInfo& resolve_error_info,
const net::AddressList& resolved_addresses,
const std::vector<net::HostResolverEndpointResult>& alternative_endpoints) {
if (result != net::OK) {
std::move(callback_).Run(std::nullopt);
return;
}
// If there are text results, OnTextResults is called first, so callback_
// will be null because it has already been std::moved and run.
// If callback_ is still valid, it means OnTextResults was not called,
// so we return an empty vector to indicate that there were no TXT
// records.
if (callback_) {
std::move(callback_).Run(std::vector<std::string>());
}
}
void DnsRequest::OnTextResults(const std::vector<std::string>& text_results) {
std::move(callback_).Run(text_results);
}
void DnsRequest::OnHostnameResults(
const std::vector<net::HostPortPair>& hosts) {}
} // namespace content::webid