]> git.lizzy.rs Git - connect-rs.git/blob - src/tls/server.rs
make async-oriented, remove block_on
[connect-rs.git] / src / tls / server.rs
1 use crate::tls::TlsConnectionMetadata;
2 use crate::Connection;
3 use async_std::net::*;
4 use async_tls::TlsAcceptor;
5 use log::*;
6
7 #[allow(dead_code)]
8 pub struct TlsServer {
9     local_addrs: SocketAddr,
10     listener: TcpListener,
11     acceptor: TlsAcceptor,
12 }
13
14 impl TlsServer {
15     pub async fn new<A: ToSocketAddrs + std::fmt::Display>(
16         ip_addrs: A,
17         acceptor: TlsAcceptor,
18     ) -> anyhow::Result<Self> {
19         let listener = TcpListener::bind(ip_addrs).await?;
20         info!("Started TLS server at {}", listener.local_addr()?);
21
22         Ok(Self {
23             local_addrs: listener.local_addr()?,
24             listener,
25             acceptor,
26         })
27     }
28
29     pub async fn accept(&self) -> anyhow::Result<Option<Connection>> {
30         let (tcp_stream, peer_addr) = self.listener.accept().await?;
31         debug!("Received connection attempt from {}", peer_addr);
32
33         if let Ok(tls_stream) = self.acceptor.accept(tcp_stream).await {
34             debug!("Completed TLS handshake with {}", peer_addr);
35             Ok(Some(Connection::from(TlsConnectionMetadata::Server {
36                 local_addr: self.local_addrs.clone(),
37                 peer_addr,
38                 stream: tls_stream,
39             })))
40         } else {
41             warn!("Could not encrypt connection with TLS from {}", peer_addr);
42             Ok(None)
43         }
44     }
45 }