use std::time::Duration;
use tokio::net::TcpListener;
use tokio_rustls::TlsAcceptor;
use crate::accept::{AcceptorInner, HttpOrHttpsAcceptor};
pub struct Http;
pub struct Https {
tls_acceptor: tokio_rustls::TlsAcceptor,
max_handshakes: usize,
timeout: Duration,
}
pub struct AcceptorBuilder<State> {
state: State,
listener: TcpListener,
}
impl AcceptorBuilder<Http> {
pub const fn new(listener: TcpListener) -> Self {
Self {
state: Http,
listener,
}
}
pub fn https(self, tls_acceptor: TlsAcceptor) -> AcceptorBuilder<Https> {
AcceptorBuilder {
state: Https {
tls_acceptor,
max_handshakes: tls_listener::DEFAULT_MAX_HANDSHAKES,
timeout: tls_listener::DEFAULT_HANDSHAKE_TIMEOUT,
},
listener: self.listener,
}
}
pub fn build(self) -> HttpOrHttpsAcceptor {
HttpOrHttpsAcceptor(AcceptorInner::Http(self.listener))
}
}
impl AcceptorBuilder<Https> {
#[must_use]
pub const fn max_handshakes(mut self, num: usize) -> Self {
self.state.max_handshakes = num;
self
}
#[must_use]
pub const fn timeout(mut self, timeout: Duration) -> Self {
self.state.timeout = timeout;
self
}
pub fn build(self) -> HttpOrHttpsAcceptor {
let mut tls_builder = tls_listener::builder(self.state.tls_acceptor);
tls_builder
.max_handshakes(self.state.max_handshakes)
.handshake_timeout(self.state.timeout);
let tls_listener = tls_builder.listen(self.listener);
HttpOrHttpsAcceptor(AcceptorInner::Https(tls_listener))
}
}