1 use async_tls::TlsConnector;
5 use async_std::net::{SocketAddr, TcpStream, ToSocketAddrs};
8 use futures::AsyncReadExt;
10 pub enum TlsConnectionMetadata {
12 local_addr: SocketAddr,
13 peer_addr: SocketAddr,
14 stream: client::TlsStream<TcpStream>,
17 local_addr: SocketAddr,
18 peer_addr: SocketAddr,
19 stream: server::TlsStream<TcpStream>,
24 pub fn tls_client<A: ToSocketAddrs + std::fmt::Display>(
27 connector: TlsConnector,
28 ) -> anyhow::Result<Self> {
29 let stream = futures::executor::block_on(TcpStream::connect(&ip_addrs))?;
30 info!("Established client TCP connection to {}", ip_addrs);
31 stream.set_nodelay(true)?;
33 let local_addr = stream.peer_addr()?;
34 let peer_addr = stream.peer_addr()?;
36 let encrypted_stream: client::TlsStream<TcpStream> =
37 futures::executor::block_on(connector.connect(domain, stream))?;
38 info!("Completed TLS handshake with {}", peer_addr);
40 Ok(Self::from(TlsConnectionMetadata::Client {
43 stream: encrypted_stream,
48 impl From<TlsConnectionMetadata> for Connection {
49 fn from(metadata: TlsConnectionMetadata) -> Self {
51 TlsConnectionMetadata::Client {
56 let (read_stream, write_stream) = stream.split();
61 Box::pin(read_stream),
62 Box::pin(write_stream),
66 TlsConnectionMetadata::Server {
71 let (read_stream, write_stream) = stream.split();
76 Box::pin(read_stream),
77 Box::pin(write_stream),