]> git.lizzy.rs Git - connect-rs.git/blob - src/tls/server.rs
4d92e2ee109bab8606ce75b34475e051ff643b87
[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_std::prelude::*;
6 use async_std::task;
7 use async_tls::TlsAcceptor;
8 use futures::task::{Context, Poll};
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 fn new<A: ToSocketAddrs + std::fmt::Display>(
20         ip_addrs: A,
21         acceptor: TlsAcceptor,
22     ) -> anyhow::Result<Self> {
23         let listener = task::block_on(TcpListener::bind(ip_addrs))?;
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         if let Some(Ok(tcp_stream)) = futures::executor::block_on(self.listener.incoming().next()) {
39             let local_addr = tcp_stream
40                 .local_addr()
41                 .expect("Local address could not be retrieved");
42
43             let peer_addr = tcp_stream
44                 .peer_addr()
45                 .expect("Peer address could not be retrieved");
46             debug!("Received connection attempt from {}", peer_addr);
47
48             if let Ok(tls_stream) = futures::executor::block_on(self.acceptor.accept(tcp_stream)) {
49                 debug!("Completed TLS handshake with {}", peer_addr);
50                 Poll::Ready(Some(Connection::from(TlsConnectionMetadata::Server {
51                     local_addr,
52                     peer_addr,
53                     stream: tls_stream,
54                 })))
55             } else {
56                 warn!("Could not encrypt connection with TLS from {}", peer_addr);
57                 Poll::Pending
58             }
59         } else {
60             info!("Shutting TLS server down at {}", self.local_addrs);
61             Poll::Ready(None)
62         }
63     }
64 }