1 use crate::tls::TlsConnectionMetadata;
4 use async_std::pin::Pin;
5 use async_std::prelude::*;
6 use async_tls::TlsAcceptor;
7 use futures::task::{Context, Poll};
11 pub struct TlsServer {
12 local_addrs: SocketAddr,
13 listener: TcpListener,
14 acceptor: TlsAcceptor,
18 pub fn new<A: ToSocketAddrs + std::fmt::Display>(
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()?);
26 local_addrs: listener.local_addr()?,
33 impl Stream for TlsServer {
34 type Item = Connection;
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
40 .expect("Local address could not be retrieved");
42 let peer_addr = tcp_stream
44 .expect("Peer address could not be retrieved");
45 debug!("Received connection attempt from {}", peer_addr);
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 {
55 warn!("Could not encrypt connection with TLS from {}", peer_addr);
56 // @otodo close the tcp-stream connection
60 info!("Shutting TLS server down at {}", self.local_addrs);