use std::path::Path;
use crate::extract::{FiveTuple, FiveTupleKey};
use crate::http::exchange::{HttpExchange, HttpExchangeParser};
use crate::http::session::{HttpMessage, HttpParser};
use crate::http::types::{HttpRequest, HttpResponse};
use crate::pcap::PcapFlowSource;
use crate::{Result, SessionEvent};
pub fn requests_from_pcap<P: AsRef<Path>>(
path: P,
) -> Result<impl Iterator<Item = (FiveTupleKey, HttpRequest)>> {
let source = PcapFlowSource::open(path)?;
Ok(source
.sessions(FiveTuple::bidirectional(), HttpParser::default())
.filter_map(|evt| evt.ok())
.filter_map(|evt| match evt {
SessionEvent::Application {
key,
message: HttpMessage::Request(req),
..
} => Some((key, req)),
_ => None,
}))
}
pub fn responses_from_pcap<P: AsRef<Path>>(
path: P,
) -> Result<impl Iterator<Item = (FiveTupleKey, HttpResponse)>> {
let source = PcapFlowSource::open(path)?;
Ok(source
.sessions(FiveTuple::bidirectional(), HttpParser::default())
.filter_map(|evt| evt.ok())
.filter_map(|evt| match evt {
SessionEvent::Application {
key,
message: HttpMessage::Response(resp),
..
} => Some((key, resp)),
_ => None,
}))
}
pub fn exchanges_from_pcap<P: AsRef<Path>>(
path: P,
) -> Result<impl Iterator<Item = (FiveTupleKey, HttpExchange)>> {
let source = PcapFlowSource::open(path)?;
Ok(source
.sessions(FiveTuple::bidirectional(), HttpExchangeParser::new())
.filter_map(|evt| evt.ok())
.filter_map(|evt| match evt {
SessionEvent::Application { key, message, .. } => Some((key, message)),
_ => None,
}))
}