use std::collections::{HashMap, HashSet};
use bytes::Bytes;
use h2session::{H2ConnectionState, ParsedH2Message, StreamId, TimestampNs};
use crate::{
h1::{HttpRequest, HttpResponse},
traits::Direction,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Protocol {
Unknown,
Http1,
Http2,
}
#[derive(Debug, Clone)]
pub(crate) struct DataChunk {
pub(crate) data: Bytes,
pub(crate) timestamp_ns: TimestampNs,
#[allow(dead_code)]
pub(crate) direction: Direction,
}
pub(crate) struct Connection {
pub(crate) process_id: u32,
pub(crate) remote_port: Option<u16>,
pub(crate) protocol: Protocol,
pub(crate) request_chunks: Vec<DataChunk>,
pub(crate) response_chunks: Vec<DataChunk>,
pub(crate) last_activity_ns: TimestampNs,
pub(crate) request_complete: bool,
pub(crate) response_complete: bool,
pub(crate) h1_write_buffer: Vec<u8>,
pub(crate) h1_read_buffer: Vec<u8>,
pub(crate) request_body_size: usize,
pub(crate) response_body_size: usize,
pub(crate) h1_request: Option<HttpRequest>,
pub(crate) h1_response: Option<HttpResponse>,
pub(crate) h1_write_parsed: bool,
pub(crate) h1_read_parsed: bool,
pub(crate) h1_request_emitted: bool,
pub(crate) h1_response_emitted: bool,
pub(crate) h2_write_state: H2ConnectionState,
pub(crate) h2_read_state: H2ConnectionState,
pub(crate) pending_requests: HashMap<StreamId, ParsedH2Message>,
pub(crate) pending_responses: HashMap<StreamId, ParsedH2Message>,
pub(crate) h2_emitted_requests: HashSet<StreamId>,
pub(crate) h2_emitted_responses: HashSet<StreamId>,
pub(crate) ready_streams: HashSet<StreamId>,
}
impl Connection {
pub(crate) fn new(process_id: u32, remote_port: u16) -> Self {
Self {
process_id,
remote_port: if remote_port == 0 {
None
} else {
Some(remote_port)
},
protocol: Protocol::Unknown,
request_chunks: Vec::new(),
response_chunks: Vec::new(),
last_activity_ns: TimestampNs(0),
request_complete: false,
response_complete: false,
h1_write_buffer: Vec::new(),
h1_read_buffer: Vec::new(),
request_body_size: 0,
response_body_size: 0,
h1_request: None,
h1_response: None,
h1_write_parsed: false,
h1_read_parsed: false,
h1_request_emitted: false,
h1_response_emitted: false,
h2_write_state: H2ConnectionState::new(),
h2_read_state: H2ConnectionState::new(),
pending_requests: HashMap::new(),
pending_responses: HashMap::new(),
h2_emitted_requests: HashSet::new(),
h2_emitted_responses: HashSet::new(),
ready_streams: HashSet::new(),
}
}
}