Skip to content

Commit eea1f5a

Browse files
committed
Skip invalid DNS server
1 parent a5e4d2a commit eea1f5a

File tree

1 file changed

+31
-12
lines changed

1 file changed

+31
-12
lines changed

leaf/src/app/dns_client.rs

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use tokio::io::{AsyncReadExt, AsyncWriteExt};
2121
use tokio::net::TcpStream;
2222
use tokio::sync::Mutex as TokioMutex;
2323
use tokio::time::timeout;
24-
use tracing::{debug, trace, Instrument};
24+
use tracing::{debug, trace, warn, Instrument};
2525

2626
#[cfg(feature = "rustls-tls")]
2727
use {
@@ -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

Comments
 (0)