]> git.lizzy.rs Git - connect-rs.git/blob - src/tls/client.rs
fix tls and cull warnings
[connect-rs.git] / src / tls / client.rs
1 use async_std::task;
2 use async_tls::TlsConnector;
3 use log::*;
4
5 use crate::Connection;
6 use async_std::net::{TcpStream, SocketAddr, ToSocketAddrs};
7 use async_tls::client;
8 use async_tls::server;
9 use futures::AsyncReadExt;
10
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> },
14 }
15
16 impl Connection {
17     pub fn tls_client<A: ToSocketAddrs + std::fmt::Display>(
18         ip_addrs: A,
19         domain: &str,
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)?;
25
26         let local_addr = stream.peer_addr()?;
27         let peer_addr = stream.peer_addr()?;
28
29         let encrypted_stream: client::TlsStream<TcpStream> =
30             task::block_on(connector.connect(domain, stream))?;
31         info!("Completed TLS handshake with {}", peer_addr);
32
33         Ok(Self::from(TlsConnectionMetadata::Client { local_addr, peer_addr, stream: encrypted_stream }))
34     }
35 }
36
37 impl From<TlsConnectionMetadata> for Connection {
38     fn from(metadata: TlsConnectionMetadata) -> Self {
39         match metadata {
40             TlsConnectionMetadata::Client { local_addr, peer_addr, stream } => {
41                 let (read_stream, write_stream) = stream.split();
42
43                 Self::new(
44                     local_addr,
45                     peer_addr,
46                     Box::new(read_stream),
47                     Box::new(write_stream),
48                 )
49             },
50
51             TlsConnectionMetadata::Server { local_addr, peer_addr, stream } => {
52                 let (read_stream, write_stream) = stream.split();
53
54                 Self::new(
55                     local_addr,
56                     peer_addr,
57                     Box::new(read_stream),
58                     Box::new(write_stream),
59                 )
60             }
61         }
62
63
64     }
65 }