blob: 6747b4c985ccae1ff9d97766621de0bc6c01644e [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "net/dns/dns_socket_allocator.h"
#include "base/logging.h"
#include "base/rand_util.h"
#include "build/build_config.h"
#include "net/base/address_list.h"
#include "net/base/ip_endpoint.h"
#include "net/base/net_errors.h"
#include "net/log/net_log_source.h"
#include "net/socket/client_socket_factory.h"
#include "net/socket/datagram_client_socket.h"
#include "net/socket/stream_socket.h"
namespace net {
DnsSocketAllocator::DnsSocketAllocator(ClientSocketFactory* socket_factory,
std::vector<IPEndPoint> nameservers,
NetLog* net_log)
: socket_factory_(socket_factory),
net_log_(net_log),
nameservers_(std::move(nameservers)) {
DCHECK(socket_factory_);
}
DnsSocketAllocator::~DnsSocketAllocator() = default;
std::unique_ptr<DatagramClientSocket>
DnsSocketAllocator::CreateConnectedUdpSocket(size_t server_index,
int* out_connection_error) {
DCHECK_LT(server_index, nameservers_.size());
DCHECK(out_connection_error);
std::unique_ptr<DatagramClientSocket> socket;
NetLogSource no_source;
socket = socket_factory_->CreateDatagramClientSocket(
DatagramSocket::RANDOM_BIND, net_log_, no_source);
DCHECK(socket);
*out_connection_error = socket->Connect(nameservers_[server_index]);
if (*out_connection_error != OK) {
DVLOG(1) << "Failed to connect socket: " << *out_connection_error;
socket.reset();
}
return socket;
}
std::unique_ptr<StreamSocket> DnsSocketAllocator::CreateTcpSocket(
size_t server_index,
const NetLogSource& source) {
DCHECK_LT(server_index, nameservers_.size());
// TODO(https://crbug.com/1123197): Pass a non-null NetworkQualityEstimator.
NetworkQualityEstimator* network_quality_estimator = nullptr;
return socket_factory_->CreateTransportClientSocket(
AddressList(nameservers_[server_index]), nullptr,
network_quality_estimator, net_log_, source);
}
} // namespace net