]> git.lizzy.rs Git - connect-rs.git/blob - src/tls/client.rs
don't block in poll_x fns, fixes conn closing issues
[connect-rs.git] / src / tls / client.rs
1 use async_tls::TlsConnector;
2 use log::*;
3
4 use crate::Connection;
5 use async_std::net::{SocketAddr, TcpStream, ToSocketAddrs};
6 use async_tls::client;
7 use async_tls::server;
8 use futures::AsyncReadExt;
9
10 pub enum TlsConnectionMetadata {
11     Client {
12         local_addr: SocketAddr,
13         peer_addr: SocketAddr,
14         stream: client::TlsStream<TcpStream>,
15     },
16     Server {
17         local_addr: SocketAddr,
18         peer_addr: SocketAddr,
19         stream: server::TlsStream<TcpStream>,
20     },
21 }
22
23 impl Connection {
24     pub fn tls_client<A: ToSocketAddrs + std::fmt::Display>(
25         ip_addrs: A,
26         domain: &str,
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)?;
32
33         let local_addr = stream.peer_addr()?;
34         let peer_addr = stream.peer_addr()?;
35
36         let encrypted_stream: client::TlsStream<TcpStream> =
37             futures::executor::block_on(connector.connect(domain, stream))?;
38         info!("Completed TLS handshake with {}", peer_addr);
39
40         Ok(Self::from(TlsConnectionMetadata::Client {
41             local_addr,
42             peer_addr,
43             stream: encrypted_stream,
44         }))
45     }
46 }
47
48 impl From<TlsConnectionMetadata> for Connection {
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::Server {
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 }