]> git.lizzy.rs Git - connect-rs.git/blob - src/tls/server.rs
use generic futures-executor in place of async-task
[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_tls::TlsAcceptor;
7 use futures::task::{Context, Poll};
8 use log::*;
9
10 #[allow(dead_code)]
11 pub struct TlsServer {
12     local_addrs: SocketAddr,
13     listener: TcpListener,
14     acceptor: TlsAcceptor,
15 }
16
17 impl TlsServer {
18     pub fn new<A: ToSocketAddrs + std::fmt::Display>(
19         ip_addrs: A,
20         acceptor: TlsAcceptor,
21     ) -> anyhow::Result<Self> {
22         let listener = futures::executor::block_on(TcpListener::bind(ip_addrs))?;
23         info!("Started TLS server at {}", listener.local_addr()?);
24
25         Ok(Self {
26             local_addrs: listener.local_addr()?,
27             listener,
28             acceptor,
29         })
30     }
31 }
32
33 impl Stream for TlsServer {
34     type Item = Connection;
35
36     fn poll_next(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
37         if let Some(Ok(tcp_stream)) = futures::executor::block_on(self.listener.incoming().next()) {
38             let local_addr = tcp_stream
39                 .local_addr()
40                 .expect("Local address could not be retrieved");
41
42             let peer_addr = tcp_stream
43                 .peer_addr()
44                 .expect("Peer address could not be retrieved");
45             debug!("Received connection attempt from {}", peer_addr);
46
47             if let Ok(tls_stream) = futures::executor::block_on(self.acceptor.accept(tcp_stream)) {
48                 debug!("Completed TLS handshake with {}", peer_addr);
49                 Poll::Ready(Some(Connection::from(TlsConnectionMetadata::Server {
50                     local_addr,
51                     peer_addr,
52                     stream: tls_stream,
53                 })))
54             } else {
55                 warn!("Could not encrypt connection with TLS from {}", peer_addr);
56                 // @otodo close the tcp-stream connection
57                 Poll::Pending
58             }
59         } else {
60             info!("Shutting TLS server down at {}", self.local_addrs);
61             Poll::Ready(None)
62         }
63     }
64 }