1 use async_std::net::{TcpStream, ToSocketAddrs};
3 use async_tls::TlsConnector;
4 use futures::AsyncReadExt;
7 use crate::tls::TlsConnectionMetadata;
11 /// Creates a [`Connection`] that uses a TLS transport
18 /// let mut conn = Connection::tls_client("127.0.0.1:3456", "localhost", client_config.into()).await?;
21 /// Please see the [tls-client](https://github.com/sachanganesh/connect-rs/blob/main/examples/tls-client/src/main.rs)
22 /// example program for a more thorough showcase.
23 pub async fn tls_client<A: ToSocketAddrs + std::fmt::Display>(
26 connector: TlsConnector,
27 ) -> anyhow::Result<Self> {
28 let stream = TcpStream::connect(&ip_addrs).await?;
29 info!("Established client TCP connection to {}", ip_addrs);
30 stream.set_nodelay(true)?;
32 let local_addr = stream.peer_addr()?;
33 let peer_addr = stream.peer_addr()?;
35 let encrypted_stream: client::TlsStream<TcpStream> =
36 connector.connect(domain, stream).await?;
37 info!("Completed TLS handshake with {}", peer_addr);
39 Ok(Self::from(TlsConnectionMetadata::Client {
42 stream: encrypted_stream,
47 impl From<TlsConnectionMetadata> for Connection {
48 /// Creates a [`Connection`] using a TLS transport from [`TlsConnectionMetadata`].
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::Listener {
71 let (read_stream, write_stream) = stream.split();
76 Box::pin(read_stream),
77 Box::pin(write_stream),