Skip to main content

huginn_net_http/output/
mod.rs

1pub mod common;
2#[cfg(feature = "p0f-request")]
3pub mod request;
4#[cfg(feature = "p0f-response")]
5pub mod response;
6
7#[cfg(feature = "json")]
8pub(crate) fn serialize_display<T: std::fmt::Display, S: serde::Serializer>(
9    val: &T,
10    s: S,
11) -> Result<S::Ok, S::Error> {
12    s.serialize_str(&val.to_string())
13}
14
15pub use common::*;
16#[cfg(feature = "p0f-request")]
17pub use request::*;
18#[cfg(feature = "p0f-response")]
19pub use response::*;
20
21/// Result of analyzing HTTP packets, mirrors the database-agnostic shape of
22/// `HuginnNetHttp::analyze_*`.
23///
24/// Field availability depends on the enabled HTTP features:
25/// - [`Self::http_request`] requires the `p0f-request` feature.
26/// - [`Self::http_response`] requires the `p0f-response` feature.
27///
28/// Use [`Self::empty`] to construct a fallback value that is valid under any
29/// feature combination.
30#[derive(Debug)]
31#[cfg_attr(feature = "json", derive(serde::Serialize))]
32pub struct HttpAnalysisResult {
33    /// Information derived from HTTP request packets.
34    #[cfg(feature = "p0f-request")]
35    pub http_request: Option<HttpRequestOutput>,
36    /// Information derived from HTTP response packets.
37    #[cfg(feature = "p0f-response")]
38    pub http_response: Option<HttpResponseOutput>,
39}
40
41impl HttpAnalysisResult {
42    #[must_use]
43    pub const fn empty() -> Self {
44        Self {
45            #[cfg(feature = "p0f-request")]
46            http_request: None,
47            #[cfg(feature = "p0f-response")]
48            http_response: None,
49        }
50    }
51
52    #[must_use]
53    pub fn is_empty(&self) -> bool {
54        #[cfg(feature = "p0f-request")]
55        if self.http_request.is_some() {
56            return false;
57        }
58        #[cfg(feature = "p0f-response")]
59        if self.http_response.is_some() {
60            return false;
61        }
62        true
63    }
64}