From 9adb9ab5f499022d693e8520bf795464b1f1483d Mon Sep 17 00:00:00 2001 From: link2xt Date: Thu, 19 Jan 2023 16:42:15 +0000 Subject: [PATCH] Return last connection error from `connect_tcp` --- src/net.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/net.rs b/src/net.rs index d162c50c4..7418d2f1f 100644 --- a/src/net.rs +++ b/src/net.rs @@ -4,7 +4,7 @@ use std::pin::Pin; use std::str::FromStr; use std::time::Duration; -use anyhow::{Context as _, Result}; +use anyhow::{Context as _, Error, Result}; use tokio::net::{lookup_host, TcpStream}; use tokio::time::timeout; use tokio_io_timeout::TimeoutStream; @@ -119,6 +119,7 @@ pub(crate) async fn connect_tcp( load_cache: bool, ) -> Result>>> { let mut tcp_stream = None; + let mut last_error = None; for resolved_addr in lookup_host_with_cache(context, host, port, load_cache).await? { match connect_tcp_inner(resolved_addr, timeout_val).await { @@ -131,12 +132,17 @@ pub(crate) async fn connect_tcp( context, "Failed to connect to {}: {:#}.", resolved_addr, err ); + last_error = Some(err); } } } - let tcp_stream = - tcp_stream.with_context(|| format!("failed to connect to {}:{}", host, port))?; + let tcp_stream = match tcp_stream { + Some(tcp_stream) => tcp_stream, + None => { + return Err(last_error.unwrap_or_else(|| Error::msg("no DNS resolution results"))); + } + }; // Disable Nagle's algorithm. tcp_stream.set_nodelay(true)?;