stream_httparse/
chunk.rs

1/// A single HTTP-Chunk used for sending
2/// Data with `Transfer-Encoding: Chunked`
3#[derive(Debug, PartialEq)]
4pub struct Chunk {
5    size: usize,
6    body: Vec<u8>,
7}
8
9impl Chunk {
10    /// Creates a new Chunk with the given Data as its
11    /// state
12    pub fn new(size: usize, data: Vec<u8>) -> Self {
13        Self { size, body: data }
14    }
15
16    /// Serializes the Chunk into the given Buffer
17    /// by appending the final Data to the End of it
18    pub fn serialize(&self, buf: &mut Vec<u8>) {
19        let length = format!("{:x}", self.size);
20        buf.extend_from_slice(length.as_bytes());
21        buf.extend_from_slice("\r\n".as_bytes());
22        buf.extend_from_slice(&self.body);
23        buf.extend_from_slice("\r\n".as_bytes());
24    }
25
26    /// The given Size of the Chunk
27    pub fn size(&self) -> usize {
28        self.size
29    }
30}
31
32#[cfg(test)]
33mod tests {
34    use super::*;
35
36    #[test]
37    fn serialize_valid() {
38        let tmp = Chunk::new(9, "Developer".as_bytes().to_vec());
39
40        let mut buf: Vec<u8> = Vec::new();
41        tmp.serialize(&mut buf);
42
43        assert_eq!("9\r\nDeveloper\r\n".as_bytes().to_vec(), buf);
44    }
45    #[test]
46    fn serialize_valid_2() {
47        let tmp = Chunk::new(
48            55,
49            "This is just some random Data to fill the Response with"
50                .as_bytes()
51                .to_vec(),
52        );
53
54        let mut buf: Vec<u8> = Vec::new();
55        tmp.serialize(&mut buf);
56
57        assert_eq!(
58            "37\r\nThis is just some random Data to fill the Response with\r\n"
59                .as_bytes()
60                .to_vec(),
61            buf
62        );
63    }
64}