use crate::internal_alloc::Vec;
use noxtls_core::{Error, Result};
pub const TLS_RECORD_HEADER_LEN: usize = 5;
pub const TLS_MAX_RECORD_PAYLOAD_LEN: usize = 1 << 14;
#[derive(Debug, Default, Clone)]
pub struct TlsRecordDeframer {
buf: Vec<u8>,
}
impl TlsRecordDeframer {
#[must_use]
pub fn noxtls_new() -> Self {
Self { buf: Vec::new() }
}
pub fn push(&mut self, chunk: &[u8]) {
self.buf.extend_from_slice(chunk);
}
pub fn pop_packet(&mut self) -> Result<Option<Vec<u8>>> {
if self.buf.len() < TLS_RECORD_HEADER_LEN {
return Ok(None);
}
let payload_len = u16::from_be_bytes([self.buf[3], self.buf[4]]) as usize;
if payload_len > TLS_MAX_RECORD_PAYLOAD_LEN {
return Err(Error::InvalidLength(
"tls record payload exceeds maximum allowed length",
));
}
let total = TLS_RECORD_HEADER_LEN.saturating_add(payload_len);
if self.buf.len() < total {
return Ok(None);
}
let packet = self.buf[..total].to_vec();
self.buf.drain(..total);
Ok(Some(packet))
}
#[must_use]
pub fn buffered_len(&self) -> usize {
self.buf.len()
}
}