rtc_shared/
tcp_framing.rs1pub const FRAMING_HEADER_LEN: usize = 2;
39
40pub const MAX_FRAMED_PACKET_SIZE: usize = u16::MAX as usize;
42
43pub fn frame_packet(buf: &[u8]) -> Vec<u8> {
65 assert!(
66 buf.len() <= MAX_FRAMED_PACKET_SIZE,
67 "packet length {} exceeds maximum {}",
68 buf.len(),
69 MAX_FRAMED_PACKET_SIZE
70 );
71
72 let mut framed = Vec::with_capacity(FRAMING_HEADER_LEN + buf.len());
73 let header = (buf.len() as u16).to_be_bytes();
74 framed.extend_from_slice(&header);
75 framed.extend_from_slice(buf);
76 framed
77}
78
79pub fn frame_packet_to(buf: &[u8], out: &mut [u8]) -> Option<usize> {
105 if buf.len() > MAX_FRAMED_PACKET_SIZE {
106 return None;
107 }
108
109 let total_len = FRAMING_HEADER_LEN + buf.len();
110 if out.len() < total_len {
111 return None;
112 }
113
114 let header = (buf.len() as u16).to_be_bytes();
115 out[..FRAMING_HEADER_LEN].copy_from_slice(&header);
116 out[FRAMING_HEADER_LEN..total_len].copy_from_slice(buf);
117
118 Some(total_len)
119}
120
121#[derive(Debug, Default)]
144pub struct TcpFrameDecoder {
145 buffer: Vec<u8>,
146}
147
148impl TcpFrameDecoder {
149 pub fn new() -> Self {
151 Self { buffer: Vec::new() }
152 }
153
154 pub fn with_capacity(capacity: usize) -> Self {
156 Self {
157 buffer: Vec::with_capacity(capacity),
158 }
159 }
160
161 pub fn extend_from_slice(&mut self, data: &[u8]) {
163 self.buffer.extend_from_slice(data);
164 }
165
166 pub fn next_packet(&mut self) -> Option<Vec<u8>> {
173 if self.buffer.len() < FRAMING_HEADER_LEN {
175 return None;
176 }
177
178 let length = u16::from_be_bytes([self.buffer[0], self.buffer[1]]) as usize;
180 let total_len = FRAMING_HEADER_LEN + length;
181
182 if self.buffer.len() < total_len {
184 return None;
185 }
186
187 let packet = self.buffer[FRAMING_HEADER_LEN..total_len].to_vec();
189
190 self.buffer.drain(..total_len);
192
193 Some(packet)
194 }
195
196 pub fn buffered_len(&self) -> usize {
198 self.buffer.len()
199 }
200
201 pub fn is_empty(&self) -> bool {
203 self.buffer.is_empty()
204 }
205
206 pub fn clear(&mut self) {
208 self.buffer.clear();
209 }
210}
211
212#[cfg(test)]
213mod tests {
214 use super::*;
215
216 #[test]
217 fn test_frame_packet() {
218 let packet = b"Hello, WebRTC!";
219 let framed = frame_packet(packet);
220
221 assert_eq!(framed.len(), FRAMING_HEADER_LEN + packet.len());
222
223 let length = u16::from_be_bytes([framed[0], framed[1]]) as usize;
225 assert_eq!(length, packet.len());
226
227 assert_eq!(&framed[FRAMING_HEADER_LEN..], packet);
229 }
230
231 #[test]
232 fn test_frame_packet_to() {
233 let packet = b"Hello";
234 let mut out = [0u8; 100];
235
236 let n = frame_packet_to(packet, &mut out).unwrap();
237 assert_eq!(n, 7);
238 assert_eq!(&out[..n], &frame_packet(packet)[..]);
239 }
240
241 #[test]
242 fn test_frame_packet_to_buffer_too_small() {
243 let packet = b"Hello";
244 let mut out = [0u8; 3]; assert!(frame_packet_to(packet, &mut out).is_none());
247 }
248
249 #[test]
250 fn test_decoder_complete_packet() {
251 let mut decoder = TcpFrameDecoder::new();
252 let framed = frame_packet(b"Test");
253
254 decoder.extend_from_slice(&framed);
255
256 let packet = decoder.next_packet().unwrap();
257 assert_eq!(packet, b"Test");
258 assert!(decoder.is_empty());
259 }
260
261 #[test]
262 fn test_decoder_partial_header() {
263 let mut decoder = TcpFrameDecoder::new();
264
265 decoder.extend_from_slice(&[0]);
267 assert!(decoder.next_packet().is_none());
268
269 decoder.extend_from_slice(&[5, b'H', b'e', b'l', b'l', b'o']);
271 assert_eq!(decoder.next_packet(), Some(b"Hello".to_vec()));
272 }
273
274 #[test]
275 fn test_decoder_partial_payload() {
276 let mut decoder = TcpFrameDecoder::new();
277
278 decoder.extend_from_slice(&[0, 5, b'H', b'e']);
280 assert!(decoder.next_packet().is_none());
281 assert_eq!(decoder.buffered_len(), 4);
282
283 decoder.extend_from_slice(&[b'l', b'l', b'o']);
285 assert_eq!(decoder.next_packet(), Some(b"Hello".to_vec()));
286 }
287
288 #[test]
289 fn test_decoder_multiple_packets() {
290 let mut decoder = TcpFrameDecoder::new();
291
292 let framed1 = frame_packet(b"First");
293 let framed2 = frame_packet(b"Second");
294 let framed3 = frame_packet(b"Third");
295
296 decoder.extend_from_slice(&framed1);
298 decoder.extend_from_slice(&framed2);
299 decoder.extend_from_slice(&framed3);
300
301 assert_eq!(decoder.next_packet(), Some(b"First".to_vec()));
302 assert_eq!(decoder.next_packet(), Some(b"Second".to_vec()));
303 assert_eq!(decoder.next_packet(), Some(b"Third".to_vec()));
304 assert!(decoder.next_packet().is_none());
305 }
306
307 #[test]
308 fn test_decoder_multiple_packets_interleaved() {
309 let mut decoder = TcpFrameDecoder::new();
310
311 let mut combined = frame_packet(b"First");
312 combined.extend_from_slice(&frame_packet(b"Second"));
313
314 decoder.extend_from_slice(&combined[..5]);
316 assert!(decoder.next_packet().is_none());
317
318 decoder.extend_from_slice(&combined[5..]);
320 assert_eq!(decoder.next_packet(), Some(b"First".to_vec()));
321 assert_eq!(decoder.next_packet(), Some(b"Second".to_vec()));
322 }
323
324 #[test]
325 fn test_empty_packet() {
326 let framed = frame_packet(b"");
327 assert_eq!(framed.len(), FRAMING_HEADER_LEN);
328 assert_eq!(framed, vec![0, 0]);
329
330 let mut decoder = TcpFrameDecoder::new();
331 decoder.extend_from_slice(&framed);
332 assert_eq!(decoder.next_packet(), Some(vec![]));
333 }
334
335 #[test]
336 #[should_panic(expected = "packet length")]
337 fn test_frame_packet_too_large() {
338 let huge = vec![0u8; MAX_FRAMED_PACKET_SIZE + 1];
339 frame_packet(&huge);
340 }
341
342 #[test]
343 fn test_decoder_clear() {
344 let mut decoder = TcpFrameDecoder::new();
345 decoder.extend_from_slice(&[0, 5, b'H']);
346
347 assert_eq!(decoder.buffered_len(), 3);
348 decoder.clear();
349 assert!(decoder.is_empty());
350 }
351}