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
27impl 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 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
69impl 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}