use crate::{
http::{
HttpRecvParams,
http2_client_pool::{Http2ClientPool, Http2RM},
push_h2_alpn,
},
misc::TcpParams,
pool::{ResourceManager, SimplePool},
rng::ChaCha20,
sync::{AsyncMutex, AtomicCell},
tls::TlsConfig,
};
#[derive(Debug)]
pub struct Http2ClientPoolBuilder<EX, TM> {
disable_auto_sni: bool,
executor: EX,
hrp: HttpRecvParams,
len: usize,
rng: ChaCha20,
tcp_params: TcpParams,
tls_config: TlsConfig<TM>,
}
impl<EX, TM> Http2ClientPoolBuilder<EX, TM> {
#[inline]
pub fn new(
executor: EX,
len: usize,
rng: ChaCha20,
mut tls_config: TlsConfig<TM>,
) -> crate::Result<Self> {
push_h2_alpn(&mut tls_config)?;
Ok(Self {
disable_auto_sni: false,
executor,
hrp: HttpRecvParams::with_optioned_params(),
len,
rng,
tcp_params: TcpParams::default(),
tls_config,
})
}
}
#[cfg(feature = "tokio")]
impl<TM> Http2ClientPoolBuilder<crate::executor::TokioExecutor, TM> {
#[inline]
pub fn tokio(len: usize, tls_config: TlsConfig<TM>) -> crate::Result<Self> {
use crate::rng::CryptoSeedableRng as _;
Self::new(
crate::executor::TokioExecutor::default(),
len,
ChaCha20::from_std_random()?,
tls_config,
)
}
}
impl<EX, TM> Http2ClientPoolBuilder<EX, TM> {
#[inline]
pub const fn disable_auto_sni_mut(&mut self) -> &mut bool {
&mut self.disable_auto_sni
}
#[inline]
pub const fn http_conn_params_mut(&mut self) -> &mut HttpRecvParams {
&mut self.hrp
}
#[inline]
pub const fn rng_mut(&mut self) -> &mut ChaCha20 {
&mut self.rng
}
#[inline]
pub const fn tcp_params_mut(&mut self) -> &mut TcpParams {
&mut self.tcp_params
}
}
impl<EX, TM> Http2ClientPoolBuilder<EX, TM>
where
Http2RM<EX, TM>: ResourceManager,
{
#[inline]
pub fn build(self) -> Http2ClientPool<EX, TM> {
Http2ClientPool {
pool: SimplePool::new(
self.len,
Http2RM {
disable_auto_sni: self.disable_auto_sni,
executor: self.executor,
hrp: self.hrp,
rng: AtomicCell::new(self.rng),
tcp_params: self.tcp_params,
tls_config: AsyncMutex::new(self.tls_config),
},
),
}
}
}