1 use crate::tls::TlsConnectionMetadata;
3 use async_std::net::{SocketAddr, TcpListener, ToSocketAddrs};
4 use async_std::pin::Pin;
5 use async_std::task::{Context, Poll};
6 use async_tls::TlsAcceptor;
7 use futures::{Stream, StreamExt};
11 pub struct TlsServer {
12 local_addrs: SocketAddr,
13 listener: TcpListener,
14 acceptor: TlsAcceptor,
18 pub async fn new<A: ToSocketAddrs + std::fmt::Display>(
20 acceptor: TlsAcceptor,
21 ) -> anyhow::Result<Self> {
22 let listener = TcpListener::bind(ip_addrs).await?;
23 info!("Started TLS server at {}", listener.local_addr()?);
26 local_addrs: listener.local_addr()?,
32 pub async fn accept(&self) -> anyhow::Result<Connection> {
33 let (tcp_stream, peer_addr) = self.listener.accept().await?;
34 debug!("Received connection attempt from {}", peer_addr);
36 match self.acceptor.accept(tcp_stream).await {
38 debug!("Completed TLS handshake with {}", peer_addr);
39 Ok(Connection::from(TlsConnectionMetadata::Server {
40 local_addr: self.local_addrs.clone(),
47 warn!("Could not encrypt connection with TLS from {}", peer_addr);
48 Err(anyhow::Error::new(e))
54 impl Stream for TlsServer {
55 type Item = Connection;
57 fn poll_next(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
58 match futures::executor::block_on(self.listener.incoming().next()) {
59 Some(Ok(tcp_stream)) => {
60 let peer_addr = tcp_stream
62 .expect("Could not retrieve peer IP address");
63 debug!("Received connection attempt from {}", peer_addr);
65 match futures::executor::block_on(self.acceptor.accept(tcp_stream)) {
67 debug!("Completed TLS handshake with {}", peer_addr);
68 Poll::Ready(Some(Connection::from(TlsConnectionMetadata::Server {
69 local_addr: self.local_addrs.clone(),
76 warn!("Could not encrypt connection with TLS from {}", peer_addr);
84 "Encountered error when trying to accept new connection {}",
90 None => Poll::Ready(None),