use bytes::Bytes; use bytes::{Buf, BytesMut}; use std::io; use tokio_util::codec::Decoder; use tokio_util::codec::Encoder; use crate::protocol::tcp::{self}; /****************************************************************************** * Encoder/Decoder trait ******************************************************************************/ #[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Default)] pub struct TcpCodec(()); impl TcpCodec { pub fn new() -> TcpCodec { TcpCodec(()) } } impl Decoder for TcpCodec { type Item = BytesMut; type Error = io::Error; fn decode(&mut self, data: &mut BytesMut) -> Result, io::Error> { println!("TcpCodec->decode(), handle data len: {}", data.len()); if data.len() < 20 { return Ok(None); } else { let parsed_tcp = tcp::parse_tcp(data); if let Ok((tcp_payload, tcp_header)) = parsed_tcp { println!("{:?}, Payload {}", tcp_header, tcp_payload.len()); // skip the tcp header data.advance(tcp_header.data_offset.into()); // TODO return Ok(Some(XXX)) return Ok(None); } else { return Err(std::io::Error::new( std::io::ErrorKind::InvalidData, format!("Invalid TCP header"), )); } } } } impl Encoder for TcpCodec { type Error = io::Error; fn encode(&mut self, _data: Bytes, _buf: &mut BytesMut) -> Result<(), io::Error> { // TODO Ok(()) } }