Skip to main content

ntex_tls/rustls/
accept.rs

1use std::{io, sync::Arc};
2
3use ntex_io::{Filter, Io, Layer};
4use ntex_service::{Ctx, Service, cfg::Cfg, cfg::Configuration};
5use ntex_util::services::Counter;
6use tls_rustls::ServerConfig;
7
8use crate::{MAX_SSL_ACCEPT_COUNTER, TlsConfig, rustls::TlsServerFilter};
9
10#[derive(Debug)]
11/// `RusTLS` based `Acceptor` service
12pub struct TlsAcceptor {
13    cfg: Arc<ServerConfig>,
14    conns: Counter,
15}
16
17impl TlsAcceptor {
18    pub fn new(cfg: Arc<ServerConfig>) -> Self {
19        MAX_SSL_ACCEPT_COUNTER.with(|conns| TlsAcceptor {
20            cfg,
21            conns: conns.clone(),
22        })
23    }
24}
25
26impl From<ServerConfig> for TlsAcceptor {
27    fn from(cfg: ServerConfig) -> Self {
28        Self::new(Arc::new(cfg))
29    }
30}
31
32impl<F: Filter, St> Service<St, Io<F>> for TlsAcceptor {
33    type Res = Io<Layer<TlsServerFilter, F>>;
34    type Error = io::Error;
35
36    async fn ready(&self, _: Ctx<'_, Self, St>) -> Result<(), Self::Error> {
37        if !self.conns.is_available() {
38            self.conns.available().await;
39        }
40        Ok(())
41    }
42
43    async fn call(&self, io: Io<F>, _: Ctx<'_, Self, St>) -> Result<Self::Res, Self::Error> {
44        let _guard = self.conns.get();
45        let cfg: Cfg<TlsConfig> = io.cfg().ctx().get();
46        super::TlsServerFilter::create(io, self.cfg.clone(), cfg.handshake_timeout()).await
47    }
48}