ntex_tls/rustls/
accept.rs1use 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)]
11pub 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}