use std::sync::Arc;
use std::time::SystemTime;
use once_cell::sync::OnceCell;
use super::l4::socket::SocketAddr;
use super::raw_connect::ProxyDigest;
use super::ssl::digest::SslDigest;
#[derive(Clone, Debug, Default)]
pub struct Digest {
pub ssl_digest: Option<Arc<SslDigest>>,
pub timing_digest: Vec<Option<TimingDigest>>,
pub proxy_digest: Option<Arc<ProxyDigest>>,
pub socket_digest: Option<Arc<SocketDigest>>,
}
pub trait ProtoDigest {
fn get_digest(&self) -> Option<&Digest> {
None
}
}
#[derive(Clone, Debug)]
pub struct TimingDigest {
pub established_ts: SystemTime,
}
impl Default for TimingDigest {
fn default() -> Self {
TimingDigest {
established_ts: SystemTime::UNIX_EPOCH,
}
}
}
#[derive(Debug)]
pub struct SocketDigest {
raw_fd: std::os::unix::io::RawFd,
pub peer_addr: OnceCell<Option<SocketAddr>>,
pub local_addr: OnceCell<Option<SocketAddr>>,
}
impl SocketDigest {
pub fn from_raw_fd(raw_fd: std::os::unix::io::RawFd) -> SocketDigest {
SocketDigest {
raw_fd,
peer_addr: OnceCell::new(),
local_addr: OnceCell::new(),
}
}
pub fn peer_addr(&self) -> Option<&SocketAddr> {
self.peer_addr
.get_or_init(|| SocketAddr::from_raw_fd(self.raw_fd, true))
.as_ref()
}
pub fn local_addr(&self) -> Option<&SocketAddr> {
self.local_addr
.get_or_init(|| SocketAddr::from_raw_fd(self.raw_fd, false))
.as_ref()
}
}
pub trait GetTimingDigest {
fn get_timing_digest(&self) -> Vec<Option<TimingDigest>>;
}
pub trait GetProxyDigest {
fn get_proxy_digest(&self) -> Option<Arc<ProxyDigest>>;
fn set_proxy_digest(&mut self, _digest: ProxyDigest) {}
}
pub trait GetSocketDigest {
fn get_socket_digest(&self) -> Option<Arc<SocketDigest>>;
fn set_socket_digest(&mut self, _socket_digest: SocketDigest) {}
}