]> git.lizzy.rs Git - connect-rs.git/blob - src/tls/server.rs
41436413ba736dea5df09b1190c769ecde7be81f
[connect-rs.git] / src / tls / server.rs
1 use crate::tls::TlsConnectionMetadata;
2 use crate::Connection;
3 use async_std::net::*;
4 use async_std::pin::Pin;
5 use async_tls::TlsAcceptor;
6 use futures::Stream;
7 use futures::task::{Context, Poll};
8 use futures_lite::StreamExt;
9 use log::*;
10
11 #[allow(dead_code)]
12 pub struct TlsServer {
13     local_addrs: SocketAddr,
14     listener: TcpListener,
15     acceptor: TlsAcceptor,
16 }
17
18 impl TlsServer {
19     pub async fn new<A: ToSocketAddrs + std::fmt::Display>(
20         ip_addrs: A,
21         acceptor: TlsAcceptor,
22     ) -> anyhow::Result<Self> {
23         let listener = TcpListener::bind(ip_addrs).await?;
24         info!("Started TLS server at {}", listener.local_addr()?);
25
26         Ok(Self {
27             local_addrs: listener.local_addr()?,
28             listener,
29             acceptor,
30         })
31     }
32 }
33
34 impl Stream for TlsServer {
35     type Item = Connection;
36
37     fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
38         match self.listener.incoming().poll_next(cx) {
39             Poll::Pending => Poll::Pending,
40
41             Poll::Ready(Some(Ok(tcp_stream))) => {
42                 let local_addr = tcp_stream
43                     .local_addr()
44                     .expect("Local address could not be retrieved");
45
46                 let peer_addr = tcp_stream
47                     .peer_addr()
48                     .expect("Peer address could not be retrieved");
49
50                 debug!(
51                     "Received connection attempt from {}", peer_addr
52                 );
53
54                 if let Ok(tls_stream) = futures::executor::block_on(self.acceptor.accept(tcp_stream)) {
55                     debug!("Completed TLS handshake with {}", peer_addr);
56                     Poll::Ready(Some(Connection::from(TlsConnectionMetadata::Server {
57                         local_addr,
58                         peer_addr,
59                         stream: tls_stream,
60                     })))
61                 } else {
62                     warn!("Could not encrypt connection with TLS from {}", peer_addr);
63                     Poll::Pending
64                 }
65             },
66
67             Poll::Ready(Some(Err(e))) => {
68                 error!(
69                     "Encountered error when accepting connection attempt: {}", e
70                 );
71
72                 Poll::Pending
73             }
74
75             Poll::Ready(None) => {
76                 info!("Shutting TLS server down at {}", self.local_addrs);
77                 Poll::Ready(None)
78             },
79         }
80     }
81 }