2 use async_tls::TlsConnector;
6 use async_std::net::{SocketAddr, TcpStream, ToSocketAddrs};
9 use futures::AsyncReadExt;
11 pub enum TlsConnectionMetadata {
13 local_addr: SocketAddr,
14 peer_addr: SocketAddr,
15 stream: client::TlsStream<TcpStream>,
18 local_addr: SocketAddr,
19 peer_addr: SocketAddr,
20 stream: server::TlsStream<TcpStream>,
25 pub fn tls_client<A: ToSocketAddrs + std::fmt::Display>(
28 connector: TlsConnector,
29 ) -> anyhow::Result<Self> {
30 let stream = task::block_on(TcpStream::connect(&ip_addrs))?;
31 info!("Established client TCP connection to {}", ip_addrs);
32 stream.set_nodelay(true)?;
34 let local_addr = stream.peer_addr()?;
35 let peer_addr = stream.peer_addr()?;
37 let encrypted_stream: client::TlsStream<TcpStream> =
38 task::block_on(connector.connect(domain, stream))?;
39 info!("Completed TLS handshake with {}", peer_addr);
41 Ok(Self::from(TlsConnectionMetadata::Client {
44 stream: encrypted_stream,
49 impl From<TlsConnectionMetadata> for Connection {
50 fn from(metadata: TlsConnectionMetadata) -> Self {
52 TlsConnectionMetadata::Client {
57 let (read_stream, write_stream) = stream.split();
62 Box::new(read_stream),
63 Box::new(write_stream),
67 TlsConnectionMetadata::Server {
72 let (read_stream, write_stream) = stream.split();
77 Box::new(read_stream),
78 Box::new(write_stream),