From bdd4db02447c68b6be528c25cde6fa1fc47bf8e1 Mon Sep 17 00:00:00 2001 From: anhcuky <42137630+anhcuky@users.noreply.github.com> Date: Wed, 1 Feb 2023 03:34:43 +0700 Subject: [PATCH] Fix `connection_verbose` to log write_vectored calls (#1737) Closes #1723 --- src/connect.rs | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/connect.rs b/src/connect.rs index 388a39bfd..b80ffc767 100644 --- a/src/connect.rs +++ b/src/connect.rs @@ -831,6 +831,7 @@ mod socks { mod verbose { use hyper::client::connect::{Connected, Connection}; + use std::cmp::min; use std::fmt; use std::io::{self, IoSlice}; use std::pin::Pin; @@ -905,7 +906,18 @@ mod verbose { cx: &mut Context<'_>, bufs: &[IoSlice<'_>], ) -> Poll> { - Pin::new(&mut self.inner).poll_write_vectored(cx, bufs) + match Pin::new(&mut self.inner).poll_write_vectored(cx, bufs) { + Poll::Ready(Ok(nwritten)) => { + log::trace!( + "{:08x} write (vectored): {:?}", + self.id, + Vectored { bufs, nwritten } + ); + Poll::Ready(Ok(nwritten)) + } + Poll::Ready(Err(e)) => Poll::Ready(Err(e)), + Poll::Pending => Poll::Pending, + } } fn is_write_vectored(&self) -> bool { @@ -955,6 +967,26 @@ mod verbose { Ok(()) } } + + struct Vectored<'a, 'b> { + bufs: &'a [IoSlice<'b>], + nwritten: usize, + } + + impl fmt::Debug for Vectored<'_, '_> { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let mut left = self.nwritten; + for buf in self.bufs.iter() { + if left == 0 { + break; + } + let n = min(left, buf.len()); + Escape(&buf[..n]).fmt(f)?; + left -= n; + } + Ok(()) + } + } } #[cfg(feature = "__tls")]