@@ -21,7 +21,7 @@ use tokio::io::{AsyncReadExt, AsyncWriteExt};
2121use tokio:: net:: TcpStream ;
2222use tokio:: sync:: Mutex as TokioMutex ;
2323use tokio:: time:: timeout;
24- use tracing:: { debug, trace, Instrument } ;
24+ use tracing:: { debug, trace, warn , Instrument } ;
2525
2626#[ cfg( feature = "rustls-tls" ) ]
2727use {
@@ -114,7 +114,10 @@ impl DnsClient {
114114 fn load_servers ( dns : & crate :: config:: Dns ) -> Result < Vec < Resolver > > {
115115 let mut servers = Vec :: new ( ) ;
116116 for server in dns. servers . iter ( ) {
117- servers. push ( Self :: parse_server ( server) ?) ;
117+ match Self :: parse_server ( server) {
118+ Ok ( parsed) => servers. push ( parsed) ,
119+ Err ( err) => warn ! ( "skip invalid dns server [{}]: {}" , server, err) ,
120+ }
118121 }
119122 for server in & servers {
120123 debug ! ( "loaded dns server: {}" , server) ;
@@ -1615,19 +1618,35 @@ mod tests {
16151618 }
16161619
16171620 #[ test]
1618- fn load_servers_rejects_invalid_doh_value ( ) {
1621+ fn load_servers_ignores_invalid_doh_value_if_any_valid_server_exists ( ) {
16191622 let mut dns = crate :: config:: Dns :: new ( ) ;
1620- dns. servers = vec ! [ "doh:@1.1.1.1" . to_string( ) ] ;
1621- let err = DnsClient :: load_servers ( & dns) . unwrap_err ( ) ;
1622- assert ! ( err. to_string( ) . contains( "invalid dns server" ) ) ;
1623-
1624- dns. servers = vec ! [ "direct:doh:example.com@not-an-ip" . to_string( ) ] ;
1625- let err = DnsClient :: load_servers ( & dns) . unwrap_err ( ) ;
1626- assert ! ( err. to_string( ) . contains( "invalid dns server" ) ) ;
1623+ dns. servers = vec ! [
1624+ "doh:@1.1.1.1" . to_string( ) ,
1625+ "direct:doh:example.com@not-an-ip" . to_string( ) ,
1626+ "doh:example.com#8.8.8.8" . to_string( ) ,
1627+ "1.1.1.1" . to_string( ) ,
1628+ ] ;
1629+ let servers = DnsClient :: load_servers ( & dns) . unwrap ( ) ;
1630+ assert_eq ! ( servers. len( ) , 1 ) ;
1631+ match & servers[ 0 ] {
1632+ Resolver :: Server ( addr, false ) => assert_eq ! (
1633+ * addr,
1634+ SocketAddr :: new( IpAddr :: V4 ( Ipv4Addr :: new( 1 , 1 , 1 , 1 ) ) , 53 )
1635+ ) ,
1636+ _ => panic ! ( "unexpected resolver" ) ,
1637+ }
1638+ }
16271639
1628- dns. servers = vec ! [ "doh:example.com#8.8.8.8" . to_string( ) ] ;
1640+ #[ test]
1641+ fn load_servers_rejects_when_all_servers_invalid ( ) {
1642+ let mut dns = crate :: config:: Dns :: new ( ) ;
1643+ dns. servers = vec ! [
1644+ "doh:@1.1.1.1" . to_string( ) ,
1645+ "direct:doh:example.com@not-an-ip" . to_string( ) ,
1646+ "doh:example.com#8.8.8.8" . to_string( ) ,
1647+ ] ;
16291648 let err = DnsClient :: load_servers ( & dns) . unwrap_err ( ) ;
1630- assert ! ( err. to_string( ) . contains( "invalid dns server " ) ) ;
1649+ assert ! ( err. to_string( ) . contains( "no dns servers " ) ) ;
16311650 }
16321651
16331652 #[ test]
0 commit comments