diff --git a/src/client/legacy/connect/http.rs b/src/client/legacy/connect/http.rs index 4e269f15..cbfb6a59 100644 --- a/src/client/legacy/connect/http.rs +++ b/src/client/legacy/connect/http.rs @@ -490,12 +490,14 @@ fn get_host_port<'u>(config: &Config, dst: &'u Uri) -> Result<(&'u str, u16), Co if dst.scheme() != Some(&Scheme::HTTP) { return Err(ConnectError { msg: INVALID_NOT_HTTP.into(), + addr: None, cause: None, }); } } else if dst.scheme().is_none() { return Err(ConnectError { msg: INVALID_MISSING_SCHEME.into(), + addr: None, cause: None, }); } @@ -505,6 +507,7 @@ fn get_host_port<'u>(config: &Config, dst: &'u Uri) -> Result<(&'u str, u16), Co None => { return Err(ConnectError { msg: INVALID_MISSING_HOST.into(), + addr: None, cause: None, }) } @@ -642,18 +645,19 @@ impl Future for HttpConnecting { // Not publicly exported (so missing_docs doesn't trigger). pub struct ConnectError { - msg: Box, + msg: &'static str, + addr: Option, cause: Option>, } impl ConnectError { - fn new(msg: S, cause: E) -> ConnectError + fn new(msg: &'static str, cause: E) -> ConnectError where - S: Into>, E: Into>, { ConnectError { - msg: msg.into(), + msg, + addr: None, cause: Some(cause.into()), } } @@ -665,9 +669,8 @@ impl ConnectError { ConnectError::new("dns error", cause) } - fn m(msg: S) -> impl FnOnce(E) -> ConnectError + fn m(msg: &'static str) -> impl FnOnce(E) -> ConnectError where - S: Into>, E: Into>, { move |cause| ConnectError::new(msg, cause) @@ -676,26 +679,21 @@ impl ConnectError { impl fmt::Debug for ConnectError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let mut b = f.debug_tuple("ConnectError"); + b.field(&self.msg); + if let Some(ref addr) = self.addr { + b.field(addr); + } if let Some(ref cause) = self.cause { - f.debug_tuple("ConnectError") - .field(&self.msg) - .field(cause) - .finish() - } else { - self.msg.fmt(f) + b.field(cause); } + b.finish() } } impl fmt::Display for ConnectError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.write_str(&self.msg)?; - - if let Some(ref cause) = self.cause { - write!(f, ": {cause}")?; - } - - Ok(()) + f.write_str(&self.msg) } } @@ -773,9 +771,13 @@ impl ConnectingTcpRemote { debug!("connected to {}", addr); return Ok(tcp); } - Err(e) => { + Err(mut e) => { trace!("connect error for {}: {:?}", addr, e); - err = Some(e); + e.addr = Some(addr); + // only return the first error, we assume it's the most relevant + if err.is_none() { + err = Some(e); + } } } }