tpkt/
lib.rs

1mod error;
2mod packet;
3
4use bytes::{Buf, BufMut, BytesMut};
5
6pub use error::*;
7pub use packet::TpktFrame;
8use tokio_util::codec::{Decoder, Encoder};
9
10pub struct TpktEncoder<E>(pub E);
11pub struct TpktDecoder<D>(pub D);
12
13impl<F, E: Encoder<F>> Encoder<TpktFrame<F>> for TpktEncoder<E>
14where
15    <E as Encoder<F>>::Error: ToTpktError + Send + Sync + 'static,
16{
17    type Error = Error;
18
19    fn encode(&mut self, item: TpktFrame<F>, dst: &mut BytesMut) -> Result<(), Self::Error> {
20        let mut payload = BytesMut::new();
21        self.0.encode(item.payload, &mut payload)?;
22        let length = payload.len() as u16 + 4;
23        dst.put_u8(item.version);
24        dst.put_u8(0);
25        dst.put_u16(length);
26        dst.extend_from_slice(payload.as_ref());
27        Ok(())
28    }
29}
30
31impl<F, D: Decoder<Item = F>> Decoder for TpktDecoder<D>
32where
33    <D as Decoder>::Error: ToTpktError + Send + Sync + 'static,
34{
35    type Item = TpktFrame<F>;
36    type Error = Error;
37
38    fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
39        if src.len() < 4 {
40            return Ok(None);
41        }
42        let (Some(index_0), Some(index_1)) = (src.get(2), src.get(3)) else {
43            unreachable!()
44        };
45        let length = u16::from_be_bytes([*index_0, *index_1]);
46        let lenght_usize = length as usize;
47        if src.len() < lenght_usize {
48            return Ok(None);
49        }
50        let mut framed_datas = src.split_to(lenght_usize);
51        let version = framed_datas.get_u8();
52        let _reserved = framed_datas.get_u8();
53        let _ = framed_datas.get_u16();
54        let Some(payload) = self.0.decode(&mut framed_datas)? else {
55            // maybe return none
56            return Err(Error::Error("payload decode fail!".to_string()));
57        };
58        Ok(Some(TpktFrame { version, payload }))
59    }
60}
61
62impl<E: Default> Default for TpktEncoder<E> {
63    fn default() -> Self {
64        Self(E::default())
65    }
66}
67
68impl<D: Default> Default for TpktDecoder<D> {
69    fn default() -> Self {
70        Self(D::default())
71    }
72}