]> git.lizzy.rs Git - connect-rs.git/blob - src/tls/server.rs
66e4206dcb844a67ffc4088ced0895cc0ba4a0de
[connect-rs.git] / src / tls / server.rs
1 use crate::Connection;
2 use crate::tls::TlsConnectionMetadata;
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>(ip_addrs: A, acceptor: TlsAcceptor) -> anyhow::Result<Self> {
20         let listener = task::block_on(TcpListener::bind(ip_addrs))?;
21         info!("Started TLS server at {}", listener.local_addr()?);
22
23         Ok(Self {
24             local_addrs: listener.local_addr()?,
25             listener,
26             acceptor,
27         })
28     }
29 }
30
31 impl Stream for TlsServer {
32     type Item = Connection;
33
34     fn poll_next(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
35         if let Some(Ok(tcp_stream)) = futures::executor::block_on(self.listener.incoming().next()) {
36             let local_addr = tcp_stream.local_addr().expect(
37                 "Local address could not be retrieved",
38             );
39
40             let peer_addr = tcp_stream.peer_addr().expect(
41                 "Peer address could not be retrieved",
42             );
43             debug!("Received connection attempt from {}", peer_addr);
44
45             if let Ok(tls_stream) = futures::executor::block_on(self.acceptor.accept(tcp_stream)) {
46                 debug!("Established TLS connection from {}", peer_addr);
47                 Poll::Ready(Some(Connection::from(TlsConnectionMetadata::Server{ local_addr, peer_addr, stream: tls_stream })))
48             } else {
49                 debug!("Could not encrypt connection with TLS from {}", peer_addr);
50                 Poll::Pending
51             }
52         } else {
53             Poll::Ready(None)
54         }
55     }
56 }