ntex_h2/frame/
head.rs

1use super::StreamId;
2
3use ntex_bytes::BufMut;
4
5#[derive(Debug, Copy, Clone, PartialEq, Eq)]
6pub struct Head {
7    kind: Kind,
8    flag: u8,
9    stream_id: StreamId,
10}
11
12#[repr(u8)]
13#[derive(Debug, Copy, Clone, PartialEq, Eq)]
14pub enum Kind {
15    Data = 0,
16    Headers = 1,
17    Priority = 2,
18    Reset = 3,
19    Settings = 4,
20    Ping = 6,
21    GoAway = 7,
22    WindowUpdate = 8,
23    Continuation = 9,
24    Unknown,
25}
26
27// ===== impl Head =====
28
29impl Head {
30    pub fn new(kind: Kind, flag: u8, stream_id: StreamId) -> Head {
31        Head {
32            kind,
33            flag,
34            stream_id,
35        }
36    }
37
38    /// Parse an HTTP/2 frame header
39    pub fn parse(header: &[u8]) -> Head {
40        let (stream_id, _) = StreamId::parse(&header[5..]);
41
42        Head {
43            stream_id,
44            kind: Kind::new(header[3]),
45            flag: header[4],
46        }
47    }
48
49    pub fn stream_id(&self) -> StreamId {
50        self.stream_id
51    }
52
53    pub fn kind(&self) -> Kind {
54        self.kind
55    }
56
57    pub fn flag(&self) -> u8 {
58        self.flag
59    }
60
61    pub fn encode<T: BufMut>(&self, payload_len: usize, dst: &mut T) {
62        dst.put_uint(payload_len as u64, 3);
63        dst.put_u8(self.kind as u8);
64        dst.put_u8(self.flag);
65        dst.put_u32(self.stream_id.into());
66    }
67}
68
69// ===== impl Kind =====
70
71impl Kind {
72    pub fn new(byte: u8) -> Kind {
73        match byte {
74            0 => Kind::Data,
75            1 => Kind::Headers,
76            2 => Kind::Priority,
77            3 => Kind::Reset,
78            4 => Kind::Settings,
79            6 => Kind::Ping,
80            7 => Kind::GoAway,
81            8 => Kind::WindowUpdate,
82            9 => Kind::Continuation,
83            _ => Kind::Unknown,
84        }
85    }
86}