1 use crate::tls::TlsConnectionMetadata;
4 use async_std::pin::Pin;
5 use async_tls::TlsAcceptor;
7 use futures::task::{Context, Poll};
8 use futures_lite::StreamExt;
12 pub struct TlsServer {
13 local_addrs: SocketAddr,
14 listener: TcpListener,
15 acceptor: TlsAcceptor,
19 pub async fn new<A: ToSocketAddrs + std::fmt::Display>(
21 acceptor: TlsAcceptor,
22 ) -> anyhow::Result<Self> {
23 let listener = TcpListener::bind(ip_addrs).await?;
24 info!("Started TLS server at {}", listener.local_addr()?);
27 local_addrs: listener.local_addr()?,
34 impl Stream for TlsServer {
35 type Item = Connection;
37 fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
38 match self.listener.incoming().poll_next(cx) {
39 Poll::Pending => Poll::Pending,
41 Poll::Ready(Some(Ok(tcp_stream))) => {
42 let local_addr = tcp_stream
44 .expect("Local address could not be retrieved");
46 let peer_addr = tcp_stream
48 .expect("Peer address could not be retrieved");
51 "Received connection attempt from {}", peer_addr
54 if let Ok(tls_stream) = futures::executor::block_on(self.acceptor.accept(tcp_stream)) {
55 debug!("Completed TLS handshake with {}", peer_addr);
56 Poll::Ready(Some(Connection::from(TlsConnectionMetadata::Server {
62 warn!("Could not encrypt connection with TLS from {}", peer_addr);
67 Poll::Ready(Some(Err(e))) => {
69 "Encountered error when accepting connection attempt: {}", e
75 Poll::Ready(None) => {
76 info!("Shutting TLS server down at {}", self.local_addrs);