use crate::verifier::fetch::{
wrap_fetch_outbound, Clock, FetchOutboundOptions, FetchOutboundResult, FetchTransport,
HttpCallRecord, Jitter, OutboundError, ReqwestTransport, RetryConfig, WrapFetchOutboundConfig,
};
struct NoSleepClock;
impl Clock for NoSleepClock {
fn sleep(&self, _duration: std::time::Duration) {}
}
struct UnitJitter;
impl Jitter for UnitJitter {
fn multiplier(&self, _attempt_index: usize) -> f64 {
1.0
}
}
pub struct GatewayFetcher<'a> {
transport: &'a dyn FetchTransport,
config: WrapFetchOutboundConfig,
audit: Vec<HttpCallRecord>,
clock: NoSleepClock,
jitter: UnitJitter,
}
impl<'a> GatewayFetcher<'a> {
#[must_use]
pub fn new(transport: &'a dyn FetchTransport, deny_hosts: Option<&[String]>) -> Self {
Self {
transport,
config: WrapFetchOutboundConfig {
deny_hosts: deny_hosts.map(<[String]>::to_vec).unwrap_or_default(),
retry: RetryConfig {
retries: 0,
..RetryConfig::default()
},
},
audit: Vec::new(),
clock: NoSleepClock,
jitter: UnitJitter,
}
}
pub fn fetch(
&mut self,
url: &str,
opts: &FetchOutboundOptions,
) -> Result<FetchOutboundResult, OutboundError> {
wrap_fetch_outbound(
self.transport,
&mut self.audit,
&self.config,
&self.clock,
&self.jitter,
url,
opts,
)
}
#[must_use]
pub fn into_audit(self) -> Vec<HttpCallRecord> {
self.audit
}
#[must_use]
pub fn audit(&self) -> &[HttpCallRecord] {
&self.audit
}
}
#[must_use]
pub fn default_transport() -> ReqwestTransport {
ReqwestTransport::new()
}