use std::io::{BufReader, stdin};
use flowscope::driver::{Driver, Event, SlotMessage};
use flowscope::extract::{FiveTuple, FiveTupleKey};
use flowscope::http::{HttpMessage, HttpParser};
use flowscope::pcap::PcapFlowSource;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let reader = BufReader::new(stdin().lock());
let source = PcapFlowSource::from_reader(reader)?;
let mut builder = Driver::builder(FiveTuple::bidirectional());
let mut http_slot = builder.session_broadcast(HttpParser::default());
let mut driver = builder.build();
let mut events: Vec<Event<FiveTupleKey>> = Vec::new();
let mut msgs: Vec<SlotMessage<HttpMessage, FiveTupleKey>> = Vec::new();
let mut count = 0u64;
for owned in source.views() {
let owned = owned?;
events.clear();
driver.track_into(&owned, &mut events);
msgs.clear();
http_slot.drain(&mut msgs);
for m in &msgs {
count += 1;
println!("{:?} → {:?}", m.key, m.message);
}
}
let mut tail = Vec::new();
driver.finish_into(&mut tail);
msgs.clear();
http_slot.drain(&mut msgs);
for m in &msgs {
count += 1;
println!("{:?} → {:?}", m.key, m.message);
}
eprintln!("processed {count} HTTP message(s) from stdin");
Ok(())
}