use crate::{
http::{
HttpRecvParams,
http2_client_pool::{Http2ClientPool, Http2RM},
push_h2_alpn,
},
net::TcpParams,
pool::{ResourceManager, SimplePool},
rng::ChaCha20,
sync::{AsyncMutex, AtomicCell},
tls::TlsConfig,
};
#[derive(Debug)]
pub struct Http2ClientPoolBuilder<AUX, EX, TM> {
aux_fn: fn() -> AUX,
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 {
aux_fn: || {},
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<AUX, EX, TM> Http2ClientPoolBuilder<AUX, 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 fn set_aux_fn<_AUX>(self, value: fn() -> _AUX) -> Http2ClientPoolBuilder<_AUX, EX, TM> {
Http2ClientPoolBuilder {
aux_fn: value,
disable_auto_sni: self.disable_auto_sni,
executor: self.executor,
hrp: self.hrp,
len: self.len,
rng: self.rng,
tcp_params: self.tcp_params,
tls_config: self.tls_config,
}
}
#[inline]
pub const fn tcp_params_mut(&mut self) -> &mut TcpParams {
&mut self.tcp_params
}
}
impl<AUX, EX, TM> Http2ClientPoolBuilder<AUX, EX, TM>
where
Http2RM<AUX, EX, TM>: ResourceManager,
{
#[inline]
pub fn build(self) -> Http2ClientPool<AUX, EX, TM> {
Http2ClientPool {
pool: SimplePool::new(
self.len,
Http2RM {
aux_fn: self.aux_fn,
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),
},
),
}
}
}