From f005b1611fe2a9780f7cf4c8f2a7ef04b3f4ccc4 Mon Sep 17 00:00:00 2001 From: ZettaScript Date: Fri, 2 May 2025 23:22:06 +0200 Subject: [PATCH 1/8] transport: Allow changing DNS resolver config --- src/transport/common/listener.rs | 18 ++++++++++-------- src/transport/tcp/config.rs | 18 ++++++++++++++++++ src/transport/tcp/connection.rs | 10 ++++++++++ src/transport/tcp/mod.rs | 31 ++++++++++++++++++++++++++----- 4 files changed, 64 insertions(+), 13 deletions(-) diff --git a/src/transport/common/listener.rs b/src/transport/common/listener.rs index a79fe8ae..0ae1144f 100644 --- a/src/transport/common/listener.rs +++ b/src/transport/common/listener.rs @@ -26,15 +26,20 @@ use crate::{ }; use futures::Stream; +<<<<<<< HEAD use hickory_resolver::{ config::ResolverConfig, name_server::TokioConnectionProvider, TokioResolver, }; +======= +use hickory_resolver::TokioAsyncResolver; +>>>>>>> d275270 (transport: Allow changing DNS resolver config) use multiaddr::{Multiaddr, Protocol}; use network_interface::{Addr, NetworkInterface, NetworkInterfaceConfig}; use socket2::{Domain, Socket, Type}; use tokio::net::{TcpListener as TokioTcpListener, TcpStream}; use std::{ + borrow::Borrow, io, net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}, pin::Pin, @@ -72,7 +77,10 @@ pub enum DnsType { impl AddressType { /// Resolve the address to a concrete IP. - pub async fn lookup_ip(self) -> Result { + pub async fn lookup_ip( + self, + resolver: impl Borrow, + ) -> Result { let (url, port, dns_type) = match self { // We already have the IP address. AddressType::Socket(address) => return Ok(address), @@ -83,13 +91,7 @@ impl AddressType { } => (address, port, dns_type), }; - let resolver = TokioResolver::builder_with_config( - ResolverConfig::default(), - TokioConnectionProvider::default(), - ) - .build(); - - let lookup = match resolver.lookup_ip(url.clone()).await { + let lookup = match resolver.borrow().lookup_ip(url.clone()).await { Ok(lookup) => lookup, Err(error) => { tracing::debug!( diff --git a/src/transport/tcp/config.rs b/src/transport/tcp/config.rs index cc7e7f52..21daee11 100644 --- a/src/transport/tcp/config.rs +++ b/src/transport/tcp/config.rs @@ -80,6 +80,12 @@ pub struct Config { /// How long should litep2p wait for a substream to be opened before considering /// the substream rejected. pub substream_open_timeout: std::time::Duration, + + /// DNS resolver config. + pub resolver_config: hickory_resolver::config::ResolverConfig, + + /// DNS resolver options. + pub resolver_opts: hickory_resolver::config::ResolverOpts, } impl Default for Config { @@ -96,6 +102,18 @@ impl Default for Config { noise_write_buffer_size: MAX_WRITE_BUFFER_SIZE, connection_open_timeout: CONNECTION_OPEN_TIMEOUT, substream_open_timeout: SUBSTREAM_OPEN_TIMEOUT, + resolver_config: Default::default(), + resolver_opts: Default::default(), } } } + +impl Config { + /// Set DNS resolver according to system configuration. + pub fn set_system_resolver(&mut self) -> hickory_resolver::error::ResolveResult<()> { + let (resolver_config, resolver_opts) = hickory_resolver::system_conf::read_system_conf()?; + self.resolver_config = resolver_config; + self.resolver_opts = resolver_opts; + Ok(()) + } +} diff --git a/src/transport/tcp/connection.rs b/src/transport/tcp/connection.rs index c208af8d..0a0e1c8e 100644 --- a/src/transport/tcp/connection.rs +++ b/src/transport/tcp/connection.rs @@ -752,6 +752,10 @@ mod tests { use crate::transport::tcp::TcpTransport; use super::*; + use hickory_resolver::{ + config::{ResolverConfig, ResolverOpts}, + TokioAsyncResolver, + }; use tokio::{io::AsyncWriteExt, net::TcpListener}; #[tokio::test] @@ -775,6 +779,7 @@ mod tests { Default::default(), Duration::from_secs(10), false, + TokioAsyncResolver::tokio(ResolverConfig::default(), ResolverOpts::default()), ) .await .unwrap(); @@ -870,6 +875,7 @@ mod tests { Default::default(), Duration::from_secs(10), false, + TokioAsyncResolver::tokio(ResolverConfig::default(), ResolverOpts::default()), ) .await .unwrap(); @@ -1012,6 +1018,7 @@ mod tests { Default::default(), Duration::from_secs(10), false, + TokioAsyncResolver::tokio(ResolverConfig::default(), ResolverOpts::default()), ) .await .unwrap(); @@ -1058,6 +1065,7 @@ mod tests { Default::default(), Duration::from_secs(10), false, + TokioAsyncResolver::tokio(ResolverConfig::default(), ResolverOpts::default()), ) .await .unwrap(); @@ -1231,6 +1239,7 @@ mod tests { Default::default(), Duration::from_secs(10), false, + TokioAsyncResolver::tokio(ResolverConfig::default(), ResolverOpts::default()), ) .await .unwrap(); @@ -1359,6 +1368,7 @@ mod tests { Default::default(), Duration::from_secs(10), false, + TokioAsyncResolver::tokio(ResolverConfig::default(), ResolverOpts::default()), ) .await .unwrap(); diff --git a/src/transport/tcp/mod.rs b/src/transport/tcp/mod.rs index 748e138d..62767d34 100644 --- a/src/transport/tcp/mod.rs +++ b/src/transport/tcp/mod.rs @@ -42,14 +42,17 @@ use futures::{ stream::{AbortHandle, FuturesUnordered, Stream, StreamExt}, TryFutureExt, }; +use hickory_resolver::TokioAsyncResolver; use multiaddr::Multiaddr; use socket2::{Domain, Socket, Type}; use tokio::net::TcpStream; use std::{ + borrow::Borrow, collections::HashMap, net::SocketAddr, pin::Pin, + sync::Arc, task::{Context, Poll}, time::Duration, }; @@ -129,6 +132,9 @@ pub(crate) struct TcpTransport { /// Connections which have been opened and negotiated but are being validated by the /// `TransportManager`. pending_open: HashMap, + + /// DNS resolver. + resolver: Arc, } impl TcpTransport { @@ -176,11 +182,14 @@ impl TcpTransport { dial_addresses: DialAddresses, connection_open_timeout: Duration, nodelay: bool, + resolver: impl Borrow, ) -> Result<(Multiaddr, TcpStream), DialError> { let (socket_address, _) = TcpAddress::multiaddr_to_socket_address(&address)?; let remote_address = - match tokio::time::timeout(connection_open_timeout, socket_address.lookup_ip()).await { + match tokio::time::timeout(connection_open_timeout, socket_address.lookup_ip(resolver)) + .await + { Err(_) => { tracing::debug!( target: LOG_TARGET, @@ -288,6 +297,10 @@ impl TransportBuilder for TcpTransport { Ok(( Self { listener, + resolver: Arc::new(TokioAsyncResolver::tokio( + config.resolver_config.clone(), + config.resolver_opts.clone(), + )), config, context, dial_addresses, @@ -317,13 +330,19 @@ impl Transport for TcpTransport { let dial_addresses = self.dial_addresses.clone(); let keypair = self.context.keypair.clone(); let nodelay = self.config.nodelay; + let resolver = self.resolver.clone(); self.pending_dials.insert(connection_id, address.clone()); self.pending_connections.push(Box::pin(async move { - let (_, stream) = - TcpTransport::dial_peer(address, dial_addresses, connection_open_timeout, nodelay) - .await - .map_err(|error| (connection_id, error))?; + let (_, stream) = TcpTransport::dial_peer( + address, + dial_addresses, + connection_open_timeout, + nodelay, + resolver, + ) + .await + .map_err(|error| (connection_id, error))?; TcpConnection::open_connection( connection_id, @@ -426,6 +445,7 @@ impl Transport for TcpTransport { let dial_addresses = self.dial_addresses.clone(); let connection_open_timeout = self.config.connection_open_timeout; let nodelay = self.config.nodelay; + let resolver = self.resolver.clone(); async move { TcpTransport::dial_peer( @@ -433,6 +453,7 @@ impl Transport for TcpTransport { dial_addresses, connection_open_timeout, nodelay, + resolver, ) .await .map_err(|error| (address, error)) From 5b32479210d10730210c1c90886aeb91c3dc4d93 Mon Sep 17 00:00:00 2001 From: ZettaScript Date: Wed, 7 May 2025 23:12:52 +0200 Subject: [PATCH 2/8] use boolean flag, websocket config, Litep2pConfig --- src/config.rs | 14 ++++++++++++++ src/transport/tcp/config.rs | 20 +++----------------- src/transport/tcp/mod.rs | 12 ++++++++---- src/transport/websocket/config.rs | 4 ++++ src/transport/websocket/connection.rs | 9 +++++++++ src/transport/websocket/mod.rs | 23 +++++++++++++++++++++-- 6 files changed, 59 insertions(+), 23 deletions(-) diff --git a/src/config.rs b/src/config.rs index c2956021..13a370c9 100644 --- a/src/config.rs +++ b/src/config.rs @@ -124,6 +124,9 @@ pub struct ConfigBuilder { /// Close the connection if no substreams are open within this time frame. keep_alive_timeout: Duration, + + /// Use system's DNS config. + use_system_dns_config: bool, } impl Default for ConfigBuilder { @@ -157,6 +160,7 @@ impl ConfigBuilder { known_addresses: Vec::new(), connection_limits: ConnectionLimitsConfig::default(), keep_alive_timeout: KEEP_ALIVE_TIMEOUT, + use_system_dns_config: false, } } @@ -278,6 +282,12 @@ impl ConfigBuilder { self } + /// Set DNS resolver according to system configuration instead of default (Google). + pub fn with_system_resolver(mut self) -> Self { + self.use_system_dns_config = true; + self + } + /// Build [`Litep2pConfig`]. pub fn build(mut self) -> Litep2pConfig { let keypair = match self.keypair { @@ -307,6 +317,7 @@ impl ConfigBuilder { known_addresses: self.known_addresses, connection_limits: self.connection_limits, keep_alive_timeout: self.keep_alive_timeout, + use_system_dns_config: self.use_system_dns_config, } } } @@ -369,4 +380,7 @@ pub struct Litep2pConfig { /// Close the connection if no substreams are open within this time frame. pub(crate) keep_alive_timeout: Duration, + + /// Use system's DNS config. + pub(crate) use_system_dns_config: bool, } diff --git a/src/transport/tcp/config.rs b/src/transport/tcp/config.rs index 21daee11..229b79b6 100644 --- a/src/transport/tcp/config.rs +++ b/src/transport/tcp/config.rs @@ -81,11 +81,8 @@ pub struct Config { /// the substream rejected. pub substream_open_timeout: std::time::Duration, - /// DNS resolver config. - pub resolver_config: hickory_resolver::config::ResolverConfig, - - /// DNS resolver options. - pub resolver_opts: hickory_resolver::config::ResolverOpts, + /// Use system's DNS config. + pub use_system_dns_config: bool, } impl Default for Config { @@ -102,18 +99,7 @@ impl Default for Config { noise_write_buffer_size: MAX_WRITE_BUFFER_SIZE, connection_open_timeout: CONNECTION_OPEN_TIMEOUT, substream_open_timeout: SUBSTREAM_OPEN_TIMEOUT, - resolver_config: Default::default(), - resolver_opts: Default::default(), + use_system_dns_config: false, } } } - -impl Config { - /// Set DNS resolver according to system configuration. - pub fn set_system_resolver(&mut self) -> hickory_resolver::error::ResolveResult<()> { - let (resolver_config, resolver_opts) = hickory_resolver::system_conf::read_system_conf()?; - self.resolver_config = resolver_config; - self.resolver_opts = resolver_opts; - Ok(()) - } -} diff --git a/src/transport/tcp/mod.rs b/src/transport/tcp/mod.rs index 62767d34..05cc65b1 100644 --- a/src/transport/tcp/mod.rs +++ b/src/transport/tcp/mod.rs @@ -294,13 +294,16 @@ impl TransportBuilder for TcpTransport { config.nodelay, ); + let (resolver_config, resolver_opts) = if config.use_system_dns_config { + hickory_resolver::system_conf::read_system_conf() + .expect("TODO failed to read system DNS config") + } else { + (Default::default(), Default::default()) + }; + Ok(( Self { listener, - resolver: Arc::new(TokioAsyncResolver::tokio( - config.resolver_config.clone(), - config.resolver_opts.clone(), - )), config, context, dial_addresses, @@ -311,6 +314,7 @@ impl TransportBuilder for TcpTransport { pending_connections: FuturesStream::new(), pending_raw_connections: FuturesStream::new(), cancel_futures: HashMap::new(), + resolver: Arc::new(TokioAsyncResolver::tokio(resolver_config, resolver_opts)), }, listen_addresses, )) diff --git a/src/transport/websocket/config.rs b/src/transport/websocket/config.rs index 6efe225d..206a050a 100644 --- a/src/transport/websocket/config.rs +++ b/src/transport/websocket/config.rs @@ -80,6 +80,9 @@ pub struct Config { /// How long should litep2p wait for a substream to be opened before considering /// the substream rejected. pub substream_open_timeout: std::time::Duration, + + /// Use system's DNS config. + pub use_system_dns_config: bool, } impl Default for Config { @@ -96,6 +99,7 @@ impl Default for Config { noise_write_buffer_size: MAX_WRITE_BUFFER_SIZE, connection_open_timeout: CONNECTION_OPEN_TIMEOUT, substream_open_timeout: SUBSTREAM_OPEN_TIMEOUT, + use_system_dns_config: false, } } } diff --git a/src/transport/websocket/connection.rs b/src/transport/websocket/connection.rs index d6dc9268..ea003db4 100644 --- a/src/transport/websocket/connection.rs +++ b/src/transport/websocket/connection.rs @@ -606,6 +606,10 @@ mod tests { use super::*; use futures::AsyncWriteExt; + use hickory_resolver::{ + config::{ResolverConfig, ResolverOpts}, + TokioAsyncResolver, + }; use tokio::net::TcpListener; #[tokio::test] @@ -639,6 +643,7 @@ mod tests { Default::default(), Duration::from_secs(10), false, + TokioAsyncResolver::tokio(ResolverConfig::default(), ResolverOpts::default()), ) .await .unwrap(); @@ -754,6 +759,7 @@ mod tests { Default::default(), Duration::from_secs(10), false, + TokioAsyncResolver::tokio(ResolverConfig::default(), ResolverOpts::default()), ) .await .unwrap(); @@ -1025,6 +1031,7 @@ mod tests { Default::default(), Duration::from_secs(10), false, + TokioAsyncResolver::tokio(ResolverConfig::default(), ResolverOpts::default()), ) .await .unwrap(); @@ -1192,6 +1199,7 @@ mod tests { Default::default(), Duration::from_secs(10), false, + TokioAsyncResolver::tokio(ResolverConfig::default(), ResolverOpts::default()), ) .await .unwrap(); @@ -1345,6 +1353,7 @@ mod tests { Default::default(), Duration::from_secs(10), false, + TokioAsyncResolver::tokio(ResolverConfig::default(), ResolverOpts::default()), ) .await .unwrap(); diff --git a/src/transport/websocket/mod.rs b/src/transport/websocket/mod.rs index 72bb0305..6ebbb2ac 100644 --- a/src/transport/websocket/mod.rs +++ b/src/transport/websocket/mod.rs @@ -42,9 +42,10 @@ use futures::{ stream::{AbortHandle, FuturesUnordered}, Stream, StreamExt, TryFutureExt, }; +use hickory_resolver::TokioAsyncResolver; use multiaddr::{Multiaddr, Protocol}; use socket2::{Domain, Socket, Type}; -use std::net::SocketAddr; +use std::{borrow::Borrow, net::SocketAddr, sync::Arc}; use tokio::net::TcpStream; use tokio_tungstenite::{MaybeTlsStream, WebSocketStream}; @@ -132,6 +133,9 @@ pub(crate) struct WebSocketTransport { /// Negotiated connections waiting validation. pending_open: HashMap, + + /// DNS resolver. + resolver: Arc, } impl WebSocketTransport { @@ -224,12 +228,15 @@ impl WebSocketTransport { dial_addresses: DialAddresses, connection_open_timeout: Duration, nodelay: bool, + resolver: impl Borrow, ) -> Result<(Multiaddr, WebSocketStream>), DialError> { let (url, _) = Self::multiaddr_into_url(address.clone())?; let (socket_address, _) = WebSocketAddress::multiaddr_to_socket_address(&address)?; let remote_address = - match tokio::time::timeout(connection_open_timeout, socket_address.lookup_ip()).await { + match tokio::time::timeout(connection_open_timeout, socket_address.lookup_ip(resolver)) + .await + { Err(_) => return Err(DialError::Timeout), Ok(Err(error)) => return Err(error.into()), Ok(Ok(address)) => address, @@ -317,6 +324,13 @@ impl TransportBuilder for WebSocketTransport { config.nodelay, ); + let (resolver_config, resolver_opts) = if config.use_system_dns_config { + hickory_resolver::system_conf::read_system_conf() + .expect("TODO failed to read system DNS config") + } else { + (Default::default(), Default::default()) + }; + Ok(( Self { listener, @@ -330,6 +344,7 @@ impl TransportBuilder for WebSocketTransport { pending_connections: FuturesStream::new(), pending_raw_connections: FuturesStream::new(), cancel_futures: HashMap::new(), + resolver: Arc::new(TokioAsyncResolver::tokio(resolver_config, resolver_opts)), }, listen_addresses, )) @@ -347,6 +362,7 @@ impl Transport for WebSocketTransport { let substream_open_timeout = self.config.substream_open_timeout; let dial_addresses = self.dial_addresses.clone(); let nodelay = self.config.nodelay; + let resolver = self.resolver.clone(); self.pending_dials.insert(connection_id, address.clone()); @@ -358,6 +374,7 @@ impl Transport for WebSocketTransport { dial_addresses, connection_open_timeout, nodelay, + resolver, ) .await .map_err(|error| (connection_id, error))?; @@ -475,6 +492,7 @@ impl Transport for WebSocketTransport { let connection_open_timeout = self.config.connection_open_timeout; let dial_addresses = self.dial_addresses.clone(); let nodelay = self.config.nodelay; + let resolver = self.resolver.clone(); async move { WebSocketTransport::dial_peer( @@ -482,6 +500,7 @@ impl Transport for WebSocketTransport { dial_addresses, connection_open_timeout, nodelay, + resolver, ) .await .map_err(|error| (address, error)) From 8dd7a3883bee341464ff79d2f439901c439bb814 Mon Sep 17 00:00:00 2001 From: ZettaScript Date: Sat, 21 Jun 2025 16:00:34 +0200 Subject: [PATCH 3/8] Fix after rebase --- src/transport/common/listener.rs | 10 ++------ src/transport/tcp/connection.rs | 41 ++++++++++++++++++++++++-------- src/transport/tcp/mod.rs | 15 ++++++++---- 3 files changed, 44 insertions(+), 22 deletions(-) diff --git a/src/transport/common/listener.rs b/src/transport/common/listener.rs index 0ae1144f..e91a8d9e 100644 --- a/src/transport/common/listener.rs +++ b/src/transport/common/listener.rs @@ -26,13 +26,7 @@ use crate::{ }; use futures::Stream; -<<<<<<< HEAD -use hickory_resolver::{ - config::ResolverConfig, name_server::TokioConnectionProvider, TokioResolver, -}; -======= -use hickory_resolver::TokioAsyncResolver; ->>>>>>> d275270 (transport: Allow changing DNS resolver config) +use hickory_resolver::TokioResolver; use multiaddr::{Multiaddr, Protocol}; use network_interface::{Addr, NetworkInterface, NetworkInterfaceConfig}; use socket2::{Domain, Socket, Type}; @@ -79,7 +73,7 @@ impl AddressType { /// Resolve the address to a concrete IP. pub async fn lookup_ip( self, - resolver: impl Borrow, + resolver: impl Borrow, ) -> Result { let (url, port, dns_type) = match self { // We already have the IP address. diff --git a/src/transport/tcp/connection.rs b/src/transport/tcp/connection.rs index 0a0e1c8e..afd64b28 100644 --- a/src/transport/tcp/connection.rs +++ b/src/transport/tcp/connection.rs @@ -752,10 +752,7 @@ mod tests { use crate::transport::tcp::TcpTransport; use super::*; - use hickory_resolver::{ - config::{ResolverConfig, ResolverOpts}, - TokioAsyncResolver, - }; + use hickory_resolver::{name_server::TokioConnectionProvider, TokioResolver}; use tokio::{io::AsyncWriteExt, net::TcpListener}; #[tokio::test] @@ -779,7 +776,11 @@ mod tests { Default::default(), Duration::from_secs(10), false, - TokioAsyncResolver::tokio(ResolverConfig::default(), ResolverOpts::default()), + TokioResolver::builder_with_config( + Default::default(), + TokioConnectionProvider::default(), + ) + .build(), ) .await .unwrap(); @@ -875,7 +876,11 @@ mod tests { Default::default(), Duration::from_secs(10), false, - TokioAsyncResolver::tokio(ResolverConfig::default(), ResolverOpts::default()), + TokioResolver::builder_with_config( + Default::default(), + TokioConnectionProvider::default(), + ) + .build(), ) .await .unwrap(); @@ -1018,7 +1023,11 @@ mod tests { Default::default(), Duration::from_secs(10), false, - TokioAsyncResolver::tokio(ResolverConfig::default(), ResolverOpts::default()), + TokioResolver::builder_with_config( + Default::default(), + TokioConnectionProvider::default(), + ) + .build(), ) .await .unwrap(); @@ -1065,7 +1074,11 @@ mod tests { Default::default(), Duration::from_secs(10), false, - TokioAsyncResolver::tokio(ResolverConfig::default(), ResolverOpts::default()), + TokioResolver::builder_with_config( + Default::default(), + TokioConnectionProvider::default(), + ) + .build(), ) .await .unwrap(); @@ -1239,7 +1252,11 @@ mod tests { Default::default(), Duration::from_secs(10), false, - TokioAsyncResolver::tokio(ResolverConfig::default(), ResolverOpts::default()), + TokioResolver::builder_with_config( + Default::default(), + TokioConnectionProvider::default(), + ) + .build(), ) .await .unwrap(); @@ -1368,7 +1385,11 @@ mod tests { Default::default(), Duration::from_secs(10), false, - TokioAsyncResolver::tokio(ResolverConfig::default(), ResolverOpts::default()), + TokioResolver::builder_with_config( + Default::default(), + TokioConnectionProvider::default(), + ) + .build(), ) .await .unwrap(); diff --git a/src/transport/tcp/mod.rs b/src/transport/tcp/mod.rs index 05cc65b1..e9131204 100644 --- a/src/transport/tcp/mod.rs +++ b/src/transport/tcp/mod.rs @@ -42,7 +42,7 @@ use futures::{ stream::{AbortHandle, FuturesUnordered, Stream, StreamExt}, TryFutureExt, }; -use hickory_resolver::TokioAsyncResolver; +use hickory_resolver::{name_server::TokioConnectionProvider, TokioResolver}; use multiaddr::Multiaddr; use socket2::{Domain, Socket, Type}; use tokio::net::TcpStream; @@ -134,7 +134,7 @@ pub(crate) struct TcpTransport { pending_open: HashMap, /// DNS resolver. - resolver: Arc, + resolver: Arc, } impl TcpTransport { @@ -182,7 +182,7 @@ impl TcpTransport { dial_addresses: DialAddresses, connection_open_timeout: Duration, nodelay: bool, - resolver: impl Borrow, + resolver: impl Borrow, ) -> Result<(Multiaddr, TcpStream), DialError> { let (socket_address, _) = TcpAddress::multiaddr_to_socket_address(&address)?; @@ -314,7 +314,14 @@ impl TransportBuilder for TcpTransport { pending_connections: FuturesStream::new(), pending_raw_connections: FuturesStream::new(), cancel_futures: HashMap::new(), - resolver: Arc::new(TokioAsyncResolver::tokio(resolver_config, resolver_opts)), + resolver: Arc::new( + TokioResolver::builder_with_config( + resolver_config, + TokioConnectionProvider::default(), + ) + .with_options(resolver_opts) + .build(), + ), }, listen_addresses, )) From 3980f4adcace637808ae83ceb0944bf396213c1f Mon Sep 17 00:00:00 2001 From: ZettaScript Date: Sun, 29 Jun 2025 10:02:09 +0200 Subject: [PATCH 4/8] Init resolver early --- src/error.rs | 2 ++ src/lib.rs | 21 ++++++++++++--- src/transport/mod.rs | 9 +++++-- src/transport/quic/mod.rs | 8 ++++-- src/transport/tcp/config.rs | 4 --- src/transport/tcp/mod.rs | 37 +++++++++++---------------- src/transport/webrtc/mod.rs | 7 ++++- src/transport/websocket/config.rs | 4 --- src/transport/websocket/connection.rs | 15 +++++------ src/transport/websocket/mod.rs | 16 ++++-------- 10 files changed, 64 insertions(+), 59 deletions(-) diff --git a/src/error.rs b/src/error.rs index 448005d0..c3988d71 100644 --- a/src/error.rs +++ b/src/error.rs @@ -126,6 +126,8 @@ pub enum Error { ConnectionLimit(ConnectionLimitsError), #[error("Failed to dial peer immediately")] ImmediateDialError(#[from] ImmediateDialError), + #[error("Cannot read system DNS config")] + CannotReadSystemDnsConfig, } /// Error type for address parsing. diff --git a/src/lib.rs b/src/lib.rs index 32f61bf4..1c5e361c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -53,6 +53,7 @@ use crate::transport::webrtc::WebRtcTransport; #[cfg(feature = "websocket")] use crate::transport::websocket::WebSocketTransport; +use hickory_resolver::{name_server::TokioConnectionProvider, TokioResolver}; use multiaddr::{Multiaddr, Protocol}; use multihash::Multihash; use transport::Endpoint; @@ -158,6 +159,18 @@ impl Litep2p { let bandwidth_sink = BandwidthSink::new(); let mut listen_addresses = vec![]; + let (resolver_config, resolver_opts) = if litep2p_config.use_system_dns_config { + hickory_resolver::system_conf::read_system_conf() + .map_err(|_| Error::CannotReadSystemDnsConfig)? + } else { + (Default::default(), Default::default()) + }; + let resolver = Arc::new( + TokioResolver::builder_with_config(resolver_config, TokioConnectionProvider::default()) + .with_options(resolver_opts) + .build(), + ); + let supported_transports = Self::supported_transports(&litep2p_config); let (mut transport_manager, transport_handle) = TransportManager::new( litep2p_config.keypair.clone(), @@ -315,7 +328,7 @@ impl Litep2p { if let Some(config) = litep2p_config.tcp.take() { let handle = transport_manager.transport_handle(Arc::clone(&litep2p_config.executor)); let (transport, transport_listen_addresses) = - ::new(handle, config)?; + ::new(handle, config, resolver.clone())?; for address in transport_listen_addresses { transport_manager.register_listen_address(address.clone()); @@ -332,7 +345,7 @@ impl Litep2p { if let Some(config) = litep2p_config.quic.take() { let handle = transport_manager.transport_handle(Arc::clone(&litep2p_config.executor)); let (transport, transport_listen_addresses) = - ::new(handle, config)?; + ::new(handle, config, resolver.clone())?; for address in transport_listen_addresses { transport_manager.register_listen_address(address.clone()); @@ -349,7 +362,7 @@ impl Litep2p { if let Some(config) = litep2p_config.webrtc.take() { let handle = transport_manager.transport_handle(Arc::clone(&litep2p_config.executor)); let (transport, transport_listen_addresses) = - ::new(handle, config)?; + ::new(handle, config, resolver.clone())?; for address in transport_listen_addresses { transport_manager.register_listen_address(address.clone()); @@ -366,7 +379,7 @@ impl Litep2p { if let Some(config) = litep2p_config.websocket.take() { let handle = transport_manager.transport_handle(Arc::clone(&litep2p_config.executor)); let (transport, transport_listen_addresses) = - ::new(handle, config)?; + ::new(handle, config, resolver)?; for address in transport_listen_addresses { transport_manager.register_listen_address(address.clone()); diff --git a/src/transport/mod.rs b/src/transport/mod.rs index 1bf9b7d9..b293b8f2 100644 --- a/src/transport/mod.rs +++ b/src/transport/mod.rs @@ -23,9 +23,10 @@ use crate::{error::DialError, transport::manager::TransportHandle, types::ConnectionId, PeerId}; use futures::Stream; +use hickory_resolver::TokioResolver; use multiaddr::Multiaddr; -use std::{fmt::Debug, time::Duration}; +use std::{fmt::Debug, sync::Arc, time::Duration}; pub(crate) mod common; #[cfg(feature = "quic")] @@ -177,7 +178,11 @@ pub(crate) trait TransportBuilder { type Transport: Transport; /// Create new [`Transport`] object. - fn new(context: TransportHandle, config: Self::Config) -> crate::Result<(Self, Vec)> + fn new( + context: TransportHandle, + config: Self::Config, + resolver: Arc, + ) -> crate::Result<(Self, Vec)> where Self: Sized; } diff --git a/src/transport/quic/mod.rs b/src/transport/quic/mod.rs index 0cf5e255..2c153631 100644 --- a/src/transport/quic/mod.rs +++ b/src/transport/quic/mod.rs @@ -39,6 +39,7 @@ use futures::{ stream::{AbortHandle, FuturesUnordered}, Stream, StreamExt, TryFutureExt, }; +use hickory_resolver::TokioResolver; use multiaddr::{Multiaddr, Protocol}; use quinn::{ClientConfig, Connecting, Connection, Endpoint, IdleTimeout}; @@ -215,6 +216,7 @@ impl TransportBuilder for QuicTransport { fn new( context: TransportHandle, mut config: Self::Config, + _resolver: Arc, ) -> crate::Result<(Self, Vec)> where Self: Sized, @@ -621,9 +623,10 @@ mod tests { }, )]), }; + let resolver = Arc::new(TokioResolver::builder_tokio().unwrap().build()); let (mut transport1, listen_addresses) = - QuicTransport::new(handle1, Default::default()).unwrap(); + QuicTransport::new(handle1, Default::default(), resolver.clone()).unwrap(); let listen_address = listen_addresses[0].clone(); let keypair2 = Keypair::generate(); @@ -648,7 +651,8 @@ mod tests { )]), }; - let (mut transport2, _) = QuicTransport::new(handle2, Default::default()).unwrap(); + let (mut transport2, _) = + QuicTransport::new(handle2, Default::default(), resolver).unwrap(); let peer1: PeerId = PeerId::from_public_key(&keypair1.public().into()); let _peer2: PeerId = PeerId::from_public_key(&keypair2.public().into()); let listen_address = listen_address.with(Protocol::P2p( diff --git a/src/transport/tcp/config.rs b/src/transport/tcp/config.rs index 229b79b6..cc7e7f52 100644 --- a/src/transport/tcp/config.rs +++ b/src/transport/tcp/config.rs @@ -80,9 +80,6 @@ pub struct Config { /// How long should litep2p wait for a substream to be opened before considering /// the substream rejected. pub substream_open_timeout: std::time::Duration, - - /// Use system's DNS config. - pub use_system_dns_config: bool, } impl Default for Config { @@ -99,7 +96,6 @@ impl Default for Config { noise_write_buffer_size: MAX_WRITE_BUFFER_SIZE, connection_open_timeout: CONNECTION_OPEN_TIMEOUT, substream_open_timeout: SUBSTREAM_OPEN_TIMEOUT, - use_system_dns_config: false, } } } diff --git a/src/transport/tcp/mod.rs b/src/transport/tcp/mod.rs index e9131204..f17aef37 100644 --- a/src/transport/tcp/mod.rs +++ b/src/transport/tcp/mod.rs @@ -42,7 +42,7 @@ use futures::{ stream::{AbortHandle, FuturesUnordered, Stream, StreamExt}, TryFutureExt, }; -use hickory_resolver::{name_server::TokioConnectionProvider, TokioResolver}; +use hickory_resolver::TokioResolver; use multiaddr::Multiaddr; use socket2::{Domain, Socket, Type}; use tokio::net::TcpStream; @@ -280,6 +280,7 @@ impl TransportBuilder for TcpTransport { fn new( context: TransportHandle, mut config: Self::Config, + resolver: Arc, ) -> crate::Result<(Self, Vec)> { tracing::debug!( target: LOG_TARGET, @@ -294,13 +295,6 @@ impl TransportBuilder for TcpTransport { config.nodelay, ); - let (resolver_config, resolver_opts) = if config.use_system_dns_config { - hickory_resolver::system_conf::read_system_conf() - .expect("TODO failed to read system DNS config") - } else { - (Default::default(), Default::default()) - }; - Ok(( Self { listener, @@ -314,14 +308,7 @@ impl TransportBuilder for TcpTransport { pending_connections: FuturesStream::new(), pending_raw_connections: FuturesStream::new(), cancel_futures: HashMap::new(), - resolver: Arc::new( - TokioResolver::builder_with_config( - resolver_config, - TokioConnectionProvider::default(), - ) - .with_options(resolver_opts) - .build(), - ), + resolver, }, listen_addresses, )) @@ -759,9 +746,10 @@ mod tests { listen_addresses: vec!["/ip6/::1/tcp/0".parse().unwrap()], ..Default::default() }; + let resolver = Arc::new(TokioResolver::builder_tokio().unwrap().build()); let (mut transport1, listen_addresses) = - TcpTransport::new(handle1, transport_config1).unwrap(); + TcpTransport::new(handle1, transport_config1, resolver.clone()).unwrap(); let listen_address = listen_addresses[0].clone(); let keypair2 = Keypair::generate(); @@ -790,7 +778,7 @@ mod tests { ..Default::default() }; - let (mut transport2, _) = TcpTransport::new(handle2, transport_config2).unwrap(); + let (mut transport2, _) = TcpTransport::new(handle2, transport_config2, resolver).unwrap(); transport2.dial(ConnectionId::new(), listen_address).unwrap(); let (tx, mut from_transport2) = channel(64); @@ -852,9 +840,10 @@ mod tests { listen_addresses: vec!["/ip6/::1/tcp/0".parse().unwrap()], ..Default::default() }; + let resolver = Arc::new(TokioResolver::builder_tokio().unwrap().build()); let (mut transport1, listen_addresses) = - TcpTransport::new(handle1, transport_config1).unwrap(); + TcpTransport::new(handle1, transport_config1, resolver.clone()).unwrap(); let listen_address = listen_addresses[0].clone(); let keypair2 = Keypair::generate(); @@ -883,7 +872,7 @@ mod tests { ..Default::default() }; - let (mut transport2, _) = TcpTransport::new(handle2, transport_config2).unwrap(); + let (mut transport2, _) = TcpTransport::new(handle2, transport_config2, resolver).unwrap(); transport2.dial(ConnectionId::new(), listen_address).unwrap(); let (tx, mut from_transport2) = channel(64); @@ -936,7 +925,9 @@ mod tests { }, )]), }; - let (mut transport1, _) = TcpTransport::new(handle1, Default::default()).unwrap(); + let resolver = Arc::new(TokioResolver::builder_tokio().unwrap().build()); + let (mut transport1, _) = + TcpTransport::new(handle1, Default::default(), resolver.clone()).unwrap(); tokio::spawn(async move { while let Some(event) = transport1.next().await { @@ -973,7 +964,7 @@ mod tests { )]), }; - let (mut transport2, _) = TcpTransport::new(handle2, Default::default()).unwrap(); + let (mut transport2, _) = TcpTransport::new(handle2, Default::default(), resolver).unwrap(); let peer1: PeerId = PeerId::from_public_key(&keypair1.public().into()); let peer2: PeerId = PeerId::from_public_key(&keypair2.public().into()); @@ -1014,6 +1005,7 @@ mod tests { ConnectionLimitsConfig::default(), ); let handle = manager.transport_handle(Arc::new(DefaultExecutor {})); + let resolver = Arc::new(TokioResolver::builder_tokio().unwrap().build()); manager.register_transport( SupportedTransport::Tcp, Box::new(crate::transport::dummy::DummyTransport::new()), @@ -1024,6 +1016,7 @@ mod tests { listen_addresses: vec!["/ip4/127.0.0.1/tcp/0".parse().unwrap()], ..Default::default() }, + resolver, ) .unwrap(); diff --git a/src/transport/webrtc/mod.rs b/src/transport/webrtc/mod.rs index 7dce743d..bc060102 100644 --- a/src/transport/webrtc/mod.rs +++ b/src/transport/webrtc/mod.rs @@ -33,6 +33,7 @@ use crate::{ use futures::{future::BoxFuture, Future, Stream}; use futures_timer::Delay; +use hickory_resolver::TokioResolver; use multiaddr::{multihash::Multihash, Multiaddr, Protocol}; use socket2::{Domain, Socket, Type}; use str0m::{ @@ -423,7 +424,11 @@ impl TransportBuilder for WebRtcTransport { type Transport = WebRtcTransport; /// Create new [`Transport`] object. - fn new(context: TransportHandle, config: Self::Config) -> crate::Result<(Self, Vec)> + fn new( + context: TransportHandle, + config: Self::Config, + _resolver: Arc, + ) -> crate::Result<(Self, Vec)> where Self: Sized, { diff --git a/src/transport/websocket/config.rs b/src/transport/websocket/config.rs index 206a050a..6efe225d 100644 --- a/src/transport/websocket/config.rs +++ b/src/transport/websocket/config.rs @@ -80,9 +80,6 @@ pub struct Config { /// How long should litep2p wait for a substream to be opened before considering /// the substream rejected. pub substream_open_timeout: std::time::Duration, - - /// Use system's DNS config. - pub use_system_dns_config: bool, } impl Default for Config { @@ -99,7 +96,6 @@ impl Default for Config { noise_write_buffer_size: MAX_WRITE_BUFFER_SIZE, connection_open_timeout: CONNECTION_OPEN_TIMEOUT, substream_open_timeout: SUBSTREAM_OPEN_TIMEOUT, - use_system_dns_config: false, } } } diff --git a/src/transport/websocket/connection.rs b/src/transport/websocket/connection.rs index ea003db4..daedb63d 100644 --- a/src/transport/websocket/connection.rs +++ b/src/transport/websocket/connection.rs @@ -606,10 +606,7 @@ mod tests { use super::*; use futures::AsyncWriteExt; - use hickory_resolver::{ - config::{ResolverConfig, ResolverOpts}, - TokioAsyncResolver, - }; + use hickory_resolver::TokioResolver; use tokio::net::TcpListener; #[tokio::test] @@ -643,7 +640,7 @@ mod tests { Default::default(), Duration::from_secs(10), false, - TokioAsyncResolver::tokio(ResolverConfig::default(), ResolverOpts::default()), + TokioResolver::builder_tokio().unwrap().build(), ) .await .unwrap(); @@ -759,7 +756,7 @@ mod tests { Default::default(), Duration::from_secs(10), false, - TokioAsyncResolver::tokio(ResolverConfig::default(), ResolverOpts::default()), + TokioResolver::builder_tokio().unwrap().build(), ) .await .unwrap(); @@ -1031,7 +1028,7 @@ mod tests { Default::default(), Duration::from_secs(10), false, - TokioAsyncResolver::tokio(ResolverConfig::default(), ResolverOpts::default()), + TokioResolver::builder_tokio().unwrap().build(), ) .await .unwrap(); @@ -1199,7 +1196,7 @@ mod tests { Default::default(), Duration::from_secs(10), false, - TokioAsyncResolver::tokio(ResolverConfig::default(), ResolverOpts::default()), + TokioResolver::builder_tokio().unwrap().build(), ) .await .unwrap(); @@ -1353,7 +1350,7 @@ mod tests { Default::default(), Duration::from_secs(10), false, - TokioAsyncResolver::tokio(ResolverConfig::default(), ResolverOpts::default()), + TokioResolver::builder_tokio().unwrap().build(), ) .await .unwrap(); diff --git a/src/transport/websocket/mod.rs b/src/transport/websocket/mod.rs index 6ebbb2ac..9f550e58 100644 --- a/src/transport/websocket/mod.rs +++ b/src/transport/websocket/mod.rs @@ -42,7 +42,7 @@ use futures::{ stream::{AbortHandle, FuturesUnordered}, Stream, StreamExt, TryFutureExt, }; -use hickory_resolver::TokioAsyncResolver; +use hickory_resolver::TokioResolver; use multiaddr::{Multiaddr, Protocol}; use socket2::{Domain, Socket, Type}; use std::{borrow::Borrow, net::SocketAddr, sync::Arc}; @@ -135,7 +135,7 @@ pub(crate) struct WebSocketTransport { pending_open: HashMap, /// DNS resolver. - resolver: Arc, + resolver: Arc, } impl WebSocketTransport { @@ -228,7 +228,7 @@ impl WebSocketTransport { dial_addresses: DialAddresses, connection_open_timeout: Duration, nodelay: bool, - resolver: impl Borrow, + resolver: impl Borrow, ) -> Result<(Multiaddr, WebSocketStream>), DialError> { let (url, _) = Self::multiaddr_into_url(address.clone())?; @@ -309,6 +309,7 @@ impl TransportBuilder for WebSocketTransport { fn new( context: TransportHandle, mut config: Self::Config, + resolver: Arc, ) -> crate::Result<(Self, Vec)> where Self: Sized, @@ -324,13 +325,6 @@ impl TransportBuilder for WebSocketTransport { config.nodelay, ); - let (resolver_config, resolver_opts) = if config.use_system_dns_config { - hickory_resolver::system_conf::read_system_conf() - .expect("TODO failed to read system DNS config") - } else { - (Default::default(), Default::default()) - }; - Ok(( Self { listener, @@ -344,7 +338,7 @@ impl TransportBuilder for WebSocketTransport { pending_connections: FuturesStream::new(), pending_raw_connections: FuturesStream::new(), cancel_futures: HashMap::new(), - resolver: Arc::new(TokioAsyncResolver::tokio(resolver_config, resolver_opts)), + resolver, }, listen_addresses, )) From c09c0622830d98dad519c53e27565ae002cc4a0a Mon Sep 17 00:00:00 2001 From: ZettaScript Date: Mon, 30 Jun 2025 19:01:59 +0200 Subject: [PATCH 5/8] Apply suggestions from code review Co-authored-by: Dmitry Markin --- src/error.rs | 2 +- src/lib.rs | 2 +- src/transport/common/listener.rs | 4 ++-- src/transport/tcp/mod.rs | 2 +- src/transport/websocket/mod.rs | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/error.rs b/src/error.rs index c3988d71..b6334fb9 100644 --- a/src/error.rs +++ b/src/error.rs @@ -127,7 +127,7 @@ pub enum Error { #[error("Failed to dial peer immediately")] ImmediateDialError(#[from] ImmediateDialError), #[error("Cannot read system DNS config")] - CannotReadSystemDnsConfig, + CannotReadSystemDnsConfig(hickory_resolver::ResolveError), } /// Error type for address parsing. diff --git a/src/lib.rs b/src/lib.rs index 1c5e361c..49ccaa02 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -161,7 +161,7 @@ impl Litep2p { let (resolver_config, resolver_opts) = if litep2p_config.use_system_dns_config { hickory_resolver::system_conf::read_system_conf() - .map_err(|_| Error::CannotReadSystemDnsConfig)? + .map_err(|e| Error::CannotReadSystemDnsConfig(e))? } else { (Default::default(), Default::default()) }; diff --git a/src/transport/common/listener.rs b/src/transport/common/listener.rs index e91a8d9e..8afd3625 100644 --- a/src/transport/common/listener.rs +++ b/src/transport/common/listener.rs @@ -73,7 +73,7 @@ impl AddressType { /// Resolve the address to a concrete IP. pub async fn lookup_ip( self, - resolver: impl Borrow, + resolver: Arc, ) -> Result { let (url, port, dns_type) = match self { // We already have the IP address. @@ -85,7 +85,7 @@ impl AddressType { } => (address, port, dns_type), }; - let lookup = match resolver.borrow().lookup_ip(url.clone()).await { + let lookup = match resolver.lookup_ip(url.clone()).await { Ok(lookup) => lookup, Err(error) => { tracing::debug!( diff --git a/src/transport/tcp/mod.rs b/src/transport/tcp/mod.rs index f17aef37..e30ab98f 100644 --- a/src/transport/tcp/mod.rs +++ b/src/transport/tcp/mod.rs @@ -182,7 +182,7 @@ impl TcpTransport { dial_addresses: DialAddresses, connection_open_timeout: Duration, nodelay: bool, - resolver: impl Borrow, + resolver: Arc, ) -> Result<(Multiaddr, TcpStream), DialError> { let (socket_address, _) = TcpAddress::multiaddr_to_socket_address(&address)?; diff --git a/src/transport/websocket/mod.rs b/src/transport/websocket/mod.rs index 9f550e58..f30e2342 100644 --- a/src/transport/websocket/mod.rs +++ b/src/transport/websocket/mod.rs @@ -228,7 +228,7 @@ impl WebSocketTransport { dial_addresses: DialAddresses, connection_open_timeout: Duration, nodelay: bool, - resolver: impl Borrow, + resolver: Arc, ) -> Result<(Multiaddr, WebSocketStream>), DialError> { let (url, _) = Self::multiaddr_into_url(address.clone())?; From 5be3bd8573d242c4cf9738560aec8e7d01911fc8 Mon Sep 17 00:00:00 2001 From: ZettaScript Date: Mon, 30 Jun 2025 19:11:35 +0200 Subject: [PATCH 6/8] clippy, fmt --- src/lib.rs | 2 +- src/transport/common/listener.rs | 6 +----- src/transport/tcp/mod.rs | 1 - 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 49ccaa02..4951642e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -161,7 +161,7 @@ impl Litep2p { let (resolver_config, resolver_opts) = if litep2p_config.use_system_dns_config { hickory_resolver::system_conf::read_system_conf() - .map_err(|e| Error::CannotReadSystemDnsConfig(e))? + .map_err(Error::CannotReadSystemDnsConfig)? } else { (Default::default(), Default::default()) }; diff --git a/src/transport/common/listener.rs b/src/transport/common/listener.rs index 8afd3625..69be376f 100644 --- a/src/transport/common/listener.rs +++ b/src/transport/common/listener.rs @@ -33,7 +33,6 @@ use socket2::{Domain, Socket, Type}; use tokio::net::{TcpListener as TokioTcpListener, TcpStream}; use std::{ - borrow::Borrow, io, net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}, pin::Pin, @@ -71,10 +70,7 @@ pub enum DnsType { impl AddressType { /// Resolve the address to a concrete IP. - pub async fn lookup_ip( - self, - resolver: Arc, - ) -> Result { + pub async fn lookup_ip(self, resolver: Arc) -> Result { let (url, port, dns_type) = match self { // We already have the IP address. AddressType::Socket(address) => return Ok(address), diff --git a/src/transport/tcp/mod.rs b/src/transport/tcp/mod.rs index e30ab98f..a97fa417 100644 --- a/src/transport/tcp/mod.rs +++ b/src/transport/tcp/mod.rs @@ -48,7 +48,6 @@ use socket2::{Domain, Socket, Type}; use tokio::net::TcpStream; use std::{ - borrow::Borrow, collections::HashMap, net::SocketAddr, pin::Pin, From 0e63a533da935bd040d0ebcd606af8908a24e48e Mon Sep 17 00:00:00 2001 From: ZettaScript Date: Wed, 2 Jul 2025 17:21:46 +0200 Subject: [PATCH 7/8] Apply suggestions from code review Co-authored-by: Dmitry Markin --- src/error.rs | 2 +- src/transport/websocket/mod.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/error.rs b/src/error.rs index b6334fb9..c835c1c8 100644 --- a/src/error.rs +++ b/src/error.rs @@ -126,7 +126,7 @@ pub enum Error { ConnectionLimit(ConnectionLimitsError), #[error("Failed to dial peer immediately")] ImmediateDialError(#[from] ImmediateDialError), - #[error("Cannot read system DNS config")] + #[error("Cannot read system DNS config: `{0}`")] CannotReadSystemDnsConfig(hickory_resolver::ResolveError), } diff --git a/src/transport/websocket/mod.rs b/src/transport/websocket/mod.rs index f30e2342..11013e6c 100644 --- a/src/transport/websocket/mod.rs +++ b/src/transport/websocket/mod.rs @@ -45,7 +45,7 @@ use futures::{ use hickory_resolver::TokioResolver; use multiaddr::{Multiaddr, Protocol}; use socket2::{Domain, Socket, Type}; -use std::{borrow::Borrow, net::SocketAddr, sync::Arc}; +use std::{net::SocketAddr, sync::Arc}; use tokio::net::TcpStream; use tokio_tungstenite::{MaybeTlsStream, WebSocketStream}; From 7af787ce25bb74d64587db2926e74600c580e4dd Mon Sep 17 00:00:00 2001 From: ZettaScript Date: Thu, 3 Jul 2025 17:57:01 +0200 Subject: [PATCH 8/8] add missing Arc --- src/transport/tcp/connection.rs | 72 ++++++++++++++++----------- src/transport/websocket/connection.rs | 11 ++-- 2 files changed, 48 insertions(+), 35 deletions(-) diff --git a/src/transport/tcp/connection.rs b/src/transport/tcp/connection.rs index afd64b28..c724dff6 100644 --- a/src/transport/tcp/connection.rs +++ b/src/transport/tcp/connection.rs @@ -776,11 +776,13 @@ mod tests { Default::default(), Duration::from_secs(10), false, - TokioResolver::builder_with_config( - Default::default(), - TokioConnectionProvider::default(), - ) - .build(), + Arc::new( + TokioResolver::builder_with_config( + Default::default(), + TokioConnectionProvider::default(), + ) + .build(), + ), ) .await .unwrap(); @@ -876,11 +878,13 @@ mod tests { Default::default(), Duration::from_secs(10), false, - TokioResolver::builder_with_config( - Default::default(), - TokioConnectionProvider::default(), - ) - .build(), + Arc::new( + TokioResolver::builder_with_config( + Default::default(), + TokioConnectionProvider::default(), + ) + .build(), + ), ) .await .unwrap(); @@ -1023,11 +1027,13 @@ mod tests { Default::default(), Duration::from_secs(10), false, - TokioResolver::builder_with_config( - Default::default(), - TokioConnectionProvider::default(), - ) - .build(), + Arc::new( + TokioResolver::builder_with_config( + Default::default(), + TokioConnectionProvider::default(), + ) + .build(), + ), ) .await .unwrap(); @@ -1074,11 +1080,13 @@ mod tests { Default::default(), Duration::from_secs(10), false, - TokioResolver::builder_with_config( - Default::default(), - TokioConnectionProvider::default(), - ) - .build(), + Arc::new( + TokioResolver::builder_with_config( + Default::default(), + TokioConnectionProvider::default(), + ) + .build(), + ), ) .await .unwrap(); @@ -1252,11 +1260,13 @@ mod tests { Default::default(), Duration::from_secs(10), false, - TokioResolver::builder_with_config( - Default::default(), - TokioConnectionProvider::default(), - ) - .build(), + Arc::new( + TokioResolver::builder_with_config( + Default::default(), + TokioConnectionProvider::default(), + ) + .build(), + ), ) .await .unwrap(); @@ -1385,11 +1395,13 @@ mod tests { Default::default(), Duration::from_secs(10), false, - TokioResolver::builder_with_config( - Default::default(), - TokioConnectionProvider::default(), - ) - .build(), + Arc::new( + TokioResolver::builder_with_config( + Default::default(), + TokioConnectionProvider::default(), + ) + .build(), + ), ) .await .unwrap(); diff --git a/src/transport/websocket/connection.rs b/src/transport/websocket/connection.rs index daedb63d..dcfe60e0 100644 --- a/src/transport/websocket/connection.rs +++ b/src/transport/websocket/connection.rs @@ -607,6 +607,7 @@ mod tests { use super::*; use futures::AsyncWriteExt; use hickory_resolver::TokioResolver; + use std::sync::Arc; use tokio::net::TcpListener; #[tokio::test] @@ -640,7 +641,7 @@ mod tests { Default::default(), Duration::from_secs(10), false, - TokioResolver::builder_tokio().unwrap().build(), + Arc::new(TokioResolver::builder_tokio().unwrap().build()), ) .await .unwrap(); @@ -756,7 +757,7 @@ mod tests { Default::default(), Duration::from_secs(10), false, - TokioResolver::builder_tokio().unwrap().build(), + Arc::new(TokioResolver::builder_tokio().unwrap().build()), ) .await .unwrap(); @@ -1028,7 +1029,7 @@ mod tests { Default::default(), Duration::from_secs(10), false, - TokioResolver::builder_tokio().unwrap().build(), + Arc::new(TokioResolver::builder_tokio().unwrap().build()), ) .await .unwrap(); @@ -1196,7 +1197,7 @@ mod tests { Default::default(), Duration::from_secs(10), false, - TokioResolver::builder_tokio().unwrap().build(), + Arc::new(TokioResolver::builder_tokio().unwrap().build()), ) .await .unwrap(); @@ -1350,7 +1351,7 @@ mod tests { Default::default(), Duration::from_secs(10), false, - TokioResolver::builder_tokio().unwrap().build(), + Arc::new(TokioResolver::builder_tokio().unwrap().build()), ) .await .unwrap();