2 use async_tls::TlsConnector;
6 use async_std::net::{TcpStream, SocketAddr, ToSocketAddrs};
9 use futures::AsyncReadExt;
11 pub enum TlsConnectionMetadata {
12 Client { local_addr: SocketAddr, peer_addr: SocketAddr, stream: client::TlsStream<TcpStream> },
13 Server { local_addr: SocketAddr, peer_addr: SocketAddr, stream: server::TlsStream<TcpStream> },
17 pub fn tls_client<A: ToSocketAddrs + std::fmt::Display>(
20 connector: TlsConnector,
21 ) -> anyhow::Result<Self> {
22 let stream = task::block_on(TcpStream::connect(&ip_addrs))?;
23 info!("Established client TCP connection to {}", ip_addrs);
24 stream.set_nodelay(true)?;
26 let local_addr = stream.peer_addr()?;
27 let peer_addr = stream.peer_addr()?;
29 let encrypted_stream: client::TlsStream<TcpStream> =
30 task::block_on(connector.connect(domain, stream))?;
31 info!("Completed TLS handshake with {}", peer_addr);
33 Ok(Self::from(TlsConnectionMetadata::Client { local_addr, peer_addr, stream: encrypted_stream }))
37 impl From<TlsConnectionMetadata> for Connection {
38 fn from(metadata: TlsConnectionMetadata) -> Self {
40 TlsConnectionMetadata::Client { local_addr, peer_addr, stream } => {
41 let (read_stream, write_stream) = stream.split();
46 Box::new(read_stream),
47 Box::new(write_stream),
51 TlsConnectionMetadata::Server { local_addr, peer_addr, stream } => {
52 let (read_stream, write_stream) = stream.split();
57 Box::new(read_stream),
58 Box::new(write_stream),