deltachat/net/
session.rs

1use anyhow::Result;
2use fast_socks5::client::Socks5Stream;
3use std::net::SocketAddr;
4use std::pin::Pin;
5use std::time::Duration;
6use tokio::io::{AsyncBufRead, AsyncRead, AsyncWrite, BufStream, BufWriter};
7use tokio::net::TcpStream;
8use tokio_io_timeout::TimeoutStream;
9
10pub(crate) trait SessionStream:
11    AsyncRead + AsyncWrite + Unpin + Send + Sync + std::fmt::Debug
12{
13    /// Change the read timeout on the session stream.
14    fn set_read_timeout(&mut self, timeout: Option<Duration>);
15
16    /// Returns the remote address that this stream is connected to.
17    fn peer_addr(&self) -> Result<SocketAddr>;
18}
19
20impl SessionStream for Box<dyn SessionStream> {
21    fn set_read_timeout(&mut self, timeout: Option<Duration>) {
22        self.as_mut().set_read_timeout(timeout);
23    }
24
25    fn peer_addr(&self) -> Result<SocketAddr> {
26        self.as_ref().peer_addr()
27    }
28}
29impl<T: SessionStream> SessionStream for async_native_tls::TlsStream<T> {
30    fn set_read_timeout(&mut self, timeout: Option<Duration>) {
31        self.get_mut().set_read_timeout(timeout);
32    }
33
34    fn peer_addr(&self) -> Result<SocketAddr> {
35        self.get_ref().peer_addr()
36    }
37}
38impl<T: SessionStream> SessionStream for tokio_rustls::client::TlsStream<T> {
39    fn set_read_timeout(&mut self, timeout: Option<Duration>) {
40        self.get_mut().0.set_read_timeout(timeout);
41    }
42    fn peer_addr(&self) -> Result<SocketAddr> {
43        self.get_ref().0.peer_addr()
44    }
45}
46impl<T: SessionStream> SessionStream for BufStream<T> {
47    fn set_read_timeout(&mut self, timeout: Option<Duration>) {
48        self.get_mut().set_read_timeout(timeout);
49    }
50
51    fn peer_addr(&self) -> Result<SocketAddr> {
52        self.get_ref().peer_addr()
53    }
54}
55impl<T: SessionStream> SessionStream for BufWriter<T> {
56    fn set_read_timeout(&mut self, timeout: Option<Duration>) {
57        self.get_mut().set_read_timeout(timeout);
58    }
59
60    fn peer_addr(&self) -> Result<SocketAddr> {
61        self.get_ref().peer_addr()
62    }
63}
64impl SessionStream for Pin<Box<TimeoutStream<TcpStream>>> {
65    fn set_read_timeout(&mut self, timeout: Option<Duration>) {
66        self.as_mut().set_read_timeout_pinned(timeout);
67    }
68
69    fn peer_addr(&self) -> Result<SocketAddr> {
70        Ok(self.get_ref().peer_addr()?)
71    }
72}
73impl<T: SessionStream> SessionStream for Socks5Stream<T> {
74    fn set_read_timeout(&mut self, timeout: Option<Duration>) {
75        self.get_socket_mut().set_read_timeout(timeout)
76    }
77
78    fn peer_addr(&self) -> Result<SocketAddr> {
79        self.get_socket_ref().peer_addr()
80    }
81}
82impl<T: SessionStream> SessionStream for shadowsocks::ProxyClientStream<T> {
83    fn set_read_timeout(&mut self, timeout: Option<Duration>) {
84        self.get_mut().set_read_timeout(timeout)
85    }
86
87    fn peer_addr(&self) -> Result<SocketAddr> {
88        self.get_ref().peer_addr()
89    }
90}
91impl<T: SessionStream> SessionStream for async_imap::DeflateStream<T> {
92    fn set_read_timeout(&mut self, timeout: Option<Duration>) {
93        self.get_mut().set_read_timeout(timeout)
94    }
95
96    fn peer_addr(&self) -> Result<SocketAddr> {
97        self.get_ref().peer_addr()
98    }
99}
100
101/// Session stream with a read buffer.
102pub(crate) trait SessionBufStream: SessionStream + AsyncBufRead {}
103
104impl<T: SessionStream + AsyncBufRead> SessionBufStream for T {}