http_collator/
connection.rs1use std::collections::{HashMap, HashSet};
4
5use bytes::Bytes;
6use h2session::{H2ConnectionState, ParsedH2Message, StreamId, TimestampNs};
7
8use crate::{
9 h1::{HttpRequest, HttpResponse},
10 traits::Direction,
11};
12
13#[derive(Debug, Clone, Copy, PartialEq, Eq)]
15pub enum Protocol {
16 Unknown,
18 Http1,
20 Http2,
22}
23
24#[derive(Debug, Clone)]
26pub(crate) struct DataChunk {
27 pub(crate) data: Bytes,
28 pub(crate) timestamp_ns: TimestampNs,
29 #[allow(dead_code)]
30 pub(crate) direction: Direction,
31}
32
33pub(crate) struct Connection {
35 pub(crate) process_id: u32,
36 pub(crate) remote_port: Option<u16>,
38 pub(crate) protocol: Protocol,
39 pub(crate) request_chunks: Vec<DataChunk>,
40 pub(crate) response_chunks: Vec<DataChunk>,
41 pub(crate) last_activity_ns: TimestampNs,
42 pub(crate) request_complete: bool,
43 pub(crate) response_complete: bool,
44
45 pub(crate) h1_write_buffer: Vec<u8>,
48 pub(crate) h1_read_buffer: Vec<u8>,
49
50 pub(crate) request_body_size: usize,
52 pub(crate) response_body_size: usize,
53
54 pub(crate) h1_request: Option<HttpRequest>,
56 pub(crate) h1_response: Option<HttpResponse>,
57
58 pub(crate) h1_write_parsed: bool,
61 pub(crate) h1_read_parsed: bool,
62
63 pub(crate) h1_request_emitted: bool,
65 pub(crate) h1_response_emitted: bool,
66
67 pub(crate) h2_write_state: H2ConnectionState,
70 pub(crate) h2_read_state: H2ConnectionState,
71
72 pub(crate) pending_requests: HashMap<StreamId, ParsedH2Message>,
74 pub(crate) pending_responses: HashMap<StreamId, ParsedH2Message>,
75
76 pub(crate) h2_emitted_requests: HashSet<StreamId>,
78 pub(crate) h2_emitted_responses: HashSet<StreamId>,
79
80 pub(crate) ready_streams: HashSet<StreamId>,
83}
84
85impl Connection {
86 pub(crate) fn new(process_id: u32, remote_port: u16) -> Self {
87 Self {
88 process_id,
89 remote_port: if remote_port == 0 {
91 None
92 } else {
93 Some(remote_port)
94 },
95 protocol: Protocol::Unknown,
96 request_chunks: Vec::new(),
97 response_chunks: Vec::new(),
98 last_activity_ns: TimestampNs(0),
99 request_complete: false,
100 response_complete: false,
101 h1_write_buffer: Vec::new(),
102 h1_read_buffer: Vec::new(),
103 request_body_size: 0,
104 response_body_size: 0,
105 h1_request: None,
106 h1_response: None,
107 h1_write_parsed: false,
108 h1_read_parsed: false,
109 h1_request_emitted: false,
110 h1_response_emitted: false,
111 h2_write_state: H2ConnectionState::new(),
112 h2_read_state: H2ConnectionState::new(),
113 pending_requests: HashMap::new(),
114 pending_responses: HashMap::new(),
115 h2_emitted_requests: HashSet::new(),
116 h2_emitted_responses: HashSet::new(),
117 ready_streams: HashSet::new(),
118 }
119 }
120}