2 use crate::tls::TlsConnectionMetadata;
4 use async_std::pin::Pin;
5 use async_std::prelude::*;
7 use async_tls::TlsAcceptor;
8 use futures::task::{Context, Poll};
12 pub struct TlsServer {
13 local_addrs: SocketAddr,
14 listener: TcpListener,
15 acceptor: TlsAcceptor,
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()?);
24 local_addrs: listener.local_addr()?,
31 impl Stream for TlsServer {
32 type Item = Connection;
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",
40 let peer_addr = tcp_stream.peer_addr().expect(
41 "Peer address could not be retrieved",
43 debug!("Received connection attempt from {}", peer_addr);
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 })))
49 debug!("Could not encrypt connection with TLS from {}", peer_addr);