use super::common::{Browser, IpPort, MatchQuality};
use crate::http::HttpDiagnosis;
use crate::observable::ObservableHttpRequest;
use std::fmt;
use std::fmt::Formatter;
#[derive(Debug)]
#[cfg_attr(feature = "json", derive(serde::Serialize))]
pub struct BrowserQualityMatched {
pub browser: Option<Browser>,
pub quality: MatchQuality,
}
#[derive(Debug)]
#[cfg_attr(feature = "json", derive(serde::Serialize))]
pub struct HttpRequestOutput {
pub source: IpPort,
pub destination: IpPort,
pub lang: Option<String>,
#[cfg_attr(feature = "json", serde(serialize_with = "super::serialize_display"))]
pub diagnosis: HttpDiagnosis,
pub browser_matched: BrowserQualityMatched,
#[cfg_attr(feature = "json", serde(serialize_with = "super::serialize_display"))]
pub sig: ObservableHttpRequest,
}
impl fmt::Display for HttpRequestOutput {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
write!(
f,
"[HTTP Request] {}:{} → {}:{}\n\
Browser: {}\n\
Lang: {}\n\
Params: {}\n\
Sig: {}\n",
self.source.ip,
self.source.port,
self.destination.ip,
self.destination.port,
self.browser_matched
.browser
.as_ref()
.map_or("???".to_string(), |browser| {
format!(
"{}:{}",
browser.family.as_deref().unwrap_or("???"),
browser.variant.as_deref().unwrap_or("???")
)
}),
self.lang.as_deref().unwrap_or("???"),
self.diagnosis,
self.sig,
)
}
}