From 14d57e780b1a1e919ea77a1f0affa5b5ba443630 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sat, 27 Jul 2024 02:24:12 +0000 Subject: [PATCH] feat: report first error instead of the last on connection failure First result has higher priority as it is the one prioritized by DNS or used recently, while the last tried server may never work at all. --- src/net.rs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/net.rs b/src/net.rs index 493a46641..cb359c13d 100644 --- a/src/net.rs +++ b/src/net.rs @@ -73,7 +73,7 @@ pub(crate) async fn connect_tcp( timeout_val: Duration, load_cache: bool, ) -> Result>>> { - let mut last_error = None; + let mut first_error = None; for resolved_addr in lookup_host_with_cache(context, host, port, timeout_val, load_cache).await? @@ -87,12 +87,12 @@ pub(crate) async fn connect_tcp( context, "Failed to connect to {}: {:#}.", resolved_addr, err ); - last_error = Some(err); + first_error.get_or_insert(err); } } } - Err(last_error.unwrap_or_else(|| format_err!("no DNS resolution results for {host}"))) + Err(first_error.unwrap_or_else(|| format_err!("no DNS resolution results for {host}"))) } pub(crate) async fn connect_tls( @@ -103,7 +103,7 @@ pub(crate) async fn connect_tls( strict_tls: bool, alpns: &[&str], ) -> Result>>>> { - let mut last_error = None; + let mut first_error = None; for resolved_addr in lookup_host_with_cache(context, host, port, timeout_val, strict_tls).await? @@ -118,12 +118,12 @@ pub(crate) async fn connect_tls( } Err(err) => { warn!(context, "Failed to connect to {resolved_addr}: {err:#}."); - last_error = Some(err); + first_error.get_or_insert(err); } } } - Err(last_error.unwrap_or_else(|| format_err!("no DNS resolution results for {host}"))) + Err(first_error.unwrap_or_else(|| format_err!("no DNS resolution results for {host}"))) } async fn connect_starttls_imap_inner( @@ -162,7 +162,7 @@ pub(crate) async fn connect_starttls_imap( timeout_val: Duration, strict_tls: bool, ) -> Result>>>> { - let mut last_error = None; + let mut first_error = None; for resolved_addr in lookup_host_with_cache(context, host, port, timeout_val, strict_tls).await? @@ -177,12 +177,12 @@ pub(crate) async fn connect_starttls_imap( } Err(err) => { warn!(context, "Failed to connect to {resolved_addr}: {err:#}."); - last_error = Some(err); + first_error.get_or_insert(err); } } } - Err(last_error.unwrap_or_else(|| format_err!("no DNS resolution results for {host}"))) + Err(first_error.unwrap_or_else(|| format_err!("no DNS resolution results for {host}"))) } async fn connect_starttls_smtp_inner( @@ -210,7 +210,7 @@ pub(crate) async fn connect_starttls_smtp( timeout_val: Duration, strict_tls: bool, ) -> Result>>>> { - let mut last_error = None; + let mut first_error = None; for resolved_addr in lookup_host_with_cache(context, host, port, timeout_val, strict_tls).await? @@ -225,10 +225,10 @@ pub(crate) async fn connect_starttls_smtp( } Err(err) => { warn!(context, "Failed to connect to {resolved_addr}: {err:#}."); - last_error = Some(err); + first_error.get_or_insert(err); } } } - Err(last_error.unwrap_or_else(|| format_err!("no DNS resolution results for {host}"))) + Err(first_error.unwrap_or_else(|| format_err!("no DNS resolution results for {host}"))) }