use super::common::{IpPort, MatchQuality, WebServer};
use crate::http::HttpDiagnosis;
use crate::observable::ObservableHttpResponse;
use std::fmt;
use std::fmt::Formatter;
#[derive(Debug)]
#[cfg_attr(feature = "json", derive(serde::Serialize))]
pub struct WebServerQualityMatched {
pub web_server: Option<WebServer>,
pub quality: MatchQuality,
}
#[derive(Debug)]
#[cfg_attr(feature = "json", derive(serde::Serialize))]
pub struct HttpResponseOutput {
pub source: IpPort,
pub destination: IpPort,
#[cfg_attr(feature = "json", serde(serialize_with = "super::serialize_display"))]
pub diagnosis: HttpDiagnosis,
pub web_server_matched: WebServerQualityMatched,
#[cfg_attr(feature = "json", serde(serialize_with = "super::serialize_display"))]
pub sig: ObservableHttpResponse,
}
impl fmt::Display for HttpResponseOutput {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
write!(
f,
"[HTTP Response] {}:{} → {}:{}\n\
Server: {}\n\
Params: {}\n\
Sig: {}\n",
self.source.ip,
self.source.port,
self.destination.ip,
self.destination.port,
self.web_server_matched
.web_server
.as_ref()
.map_or("???".to_string(), |web_server| {
if !web_server.name.is_empty() {
web_server.name.clone()
} else {
format!(
"{}:{}",
web_server.family.as_deref().unwrap_or("???"),
web_server.variant.as_deref().unwrap_or("???")
)
}
}),
self.diagnosis,
self.sig,
)
}
}