use anyhow::Result; use fast_socks5::client::Socks5Stream; use std::net::SocketAddr; use std::pin::Pin; use std::time::Duration; use tokio::io::{AsyncBufRead, AsyncRead, AsyncWrite, BufStream, BufWriter}; use tokio::net::TcpStream; use tokio_io_timeout::TimeoutStream; pub(crate) trait SessionStream: AsyncRead + AsyncWrite + Unpin + Send + Sync + std::fmt::Debug { /// Change the read timeout on the session stream. fn set_read_timeout(&mut self, timeout: Option); /// Returns the remote address that this stream is connected to. fn peer_addr(&self) -> Result; } impl SessionStream for Box { fn set_read_timeout(&mut self, timeout: Option) { self.as_mut().set_read_timeout(timeout); } fn peer_addr(&self) -> Result { self.as_ref().peer_addr() } } impl SessionStream for async_native_tls::TlsStream { fn set_read_timeout(&mut self, timeout: Option) { self.get_mut().set_read_timeout(timeout); } fn peer_addr(&self) -> Result { self.get_ref().peer_addr() } } impl SessionStream for tokio_rustls::client::TlsStream { fn set_read_timeout(&mut self, timeout: Option) { self.get_mut().0.set_read_timeout(timeout); } fn peer_addr(&self) -> Result { self.get_ref().0.peer_addr() } } impl SessionStream for BufStream { fn set_read_timeout(&mut self, timeout: Option) { self.get_mut().set_read_timeout(timeout); } fn peer_addr(&self) -> Result { self.get_ref().peer_addr() } } impl SessionStream for BufWriter { fn set_read_timeout(&mut self, timeout: Option) { self.get_mut().set_read_timeout(timeout); } fn peer_addr(&self) -> Result { self.get_ref().peer_addr() } } impl SessionStream for Pin>> { fn set_read_timeout(&mut self, timeout: Option) { self.as_mut().set_read_timeout_pinned(timeout); } fn peer_addr(&self) -> Result { Ok(self.get_ref().peer_addr()?) } } impl SessionStream for Socks5Stream { fn set_read_timeout(&mut self, timeout: Option) { self.get_socket_mut().set_read_timeout(timeout) } fn peer_addr(&self) -> Result { self.get_socket_ref().peer_addr() } } impl SessionStream for shadowsocks::ProxyClientStream { fn set_read_timeout(&mut self, timeout: Option) { self.get_mut().set_read_timeout(timeout) } fn peer_addr(&self) -> Result { self.get_ref().peer_addr() } } impl SessionStream for async_imap::DeflateStream { fn set_read_timeout(&mut self, timeout: Option) { self.get_mut().set_read_timeout(timeout) } fn peer_addr(&self) -> Result { self.get_ref().peer_addr() } } /// Session stream with a read buffer. pub(crate) trait SessionBufStream: SessionStream + AsyncBufRead {} impl SessionBufStream for T {}