]> git.lizzy.rs Git - connect-rs.git/blob - src/tls/client.rs
renamed server to listener and add thorough documentation
[connect-rs.git] / src / tls / client.rs
1 use async_std::net::{TcpStream, ToSocketAddrs};
2 use async_tls::client;
3 use async_tls::TlsConnector;
4 use futures::AsyncReadExt;
5 use log::*;
6
7 use crate::tls::TlsConnectionMetadata;
8 use crate::Connection;
9
10 impl Connection {
11     /// Creates a [`Connection`] that uses a TLS transport
12     ///
13     /// # Example
14     ///
15     /// Basic usage:
16     ///
17     /// ```ignore
18     /// let mut conn = Connection::tls_client("127.0.0.1:3456", "localhost", client_config.into()).await?;
19     /// ```
20     ///
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>(
24         ip_addrs: A,
25         domain: &str,
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)?;
31
32         let local_addr = stream.peer_addr()?;
33         let peer_addr = stream.peer_addr()?;
34
35         let encrypted_stream: client::TlsStream<TcpStream> =
36             connector.connect(domain, stream).await?;
37         info!("Completed TLS handshake with {}", peer_addr);
38
39         Ok(Self::from(TlsConnectionMetadata::Client {
40             local_addr,
41             peer_addr,
42             stream: encrypted_stream,
43         }))
44     }
45 }
46
47 impl From<TlsConnectionMetadata> for Connection {
48     /// Creates a [`Connection`] using a TLS transport from [`TlsConnectionMetadata`].
49     fn from(metadata: TlsConnectionMetadata) -> Self {
50         match metadata {
51             TlsConnectionMetadata::Client {
52                 local_addr,
53                 peer_addr,
54                 stream,
55             } => {
56                 let (read_stream, write_stream) = stream.split();
57
58                 Self::new(
59                     local_addr,
60                     peer_addr,
61                     Box::pin(read_stream),
62                     Box::pin(write_stream),
63                 )
64             }
65
66             TlsConnectionMetadata::Listener {
67                 local_addr,
68                 peer_addr,
69                 stream,
70             } => {
71                 let (read_stream, write_stream) = stream.split();
72
73                 Self::new(
74                     local_addr,
75                     peer_addr,
76                     Box::pin(read_stream),
77                     Box::pin(write_stream),
78                 )
79             }
80         }
81     }
82 }