/src/h2/src/frame/head.rs
Line | Count | Source |
1 | | use super::StreamId; |
2 | | |
3 | | use bytes::BufMut; |
4 | | |
5 | | #[derive(Debug, Copy, Clone, PartialEq, Eq)] |
6 | | pub struct Head { |
7 | | kind: Kind, |
8 | | flag: u8, |
9 | | stream_id: StreamId, |
10 | | } |
11 | | |
12 | | #[repr(u8)] |
13 | | #[derive(Debug, Copy, Clone, PartialEq, Eq)] |
14 | | pub enum Kind { |
15 | | Data = 0, |
16 | | Headers = 1, |
17 | | Priority = 2, |
18 | | Reset = 3, |
19 | | Settings = 4, |
20 | | PushPromise = 5, |
21 | | Ping = 6, |
22 | | GoAway = 7, |
23 | | WindowUpdate = 8, |
24 | | Continuation = 9, |
25 | | Unknown, |
26 | | } |
27 | | |
28 | | // ===== impl Head ===== |
29 | | |
30 | | impl Head { |
31 | 258k | pub fn new(kind: Kind, flag: u8, stream_id: StreamId) -> Head { |
32 | 258k | Head { |
33 | 258k | kind, |
34 | 258k | flag, |
35 | 258k | stream_id, |
36 | 258k | } |
37 | 258k | } |
38 | | |
39 | | /// Parse an HTTP/2 frame header |
40 | 155k | pub fn parse(header: &[u8]) -> Head { |
41 | 155k | let (stream_id, _) = StreamId::parse(&header[5..]); |
42 | | |
43 | 155k | Head { |
44 | 155k | kind: Kind::new(header[3]), |
45 | 155k | flag: header[4], |
46 | 155k | stream_id, |
47 | 155k | } |
48 | 155k | } |
49 | | |
50 | 294k | pub fn stream_id(&self) -> StreamId { |
51 | 294k | self.stream_id |
52 | 294k | } |
53 | | |
54 | 167k | pub fn kind(&self) -> Kind { |
55 | 167k | self.kind |
56 | 167k | } |
57 | | |
58 | 135k | pub fn flag(&self) -> u8 { |
59 | 135k | self.flag |
60 | 135k | } |
61 | | |
62 | 0 | pub fn encode_len(&self) -> usize { |
63 | 0 | super::HEADER_LEN |
64 | 0 | } |
65 | | |
66 | 258k | pub fn encode<T: BufMut>(&self, payload_len: usize, dst: &mut T) { |
67 | 258k | debug_assert!(self.encode_len() <= dst.remaining_mut()); |
68 | | |
69 | 258k | dst.put_uint(payload_len as u64, 3); |
70 | 258k | dst.put_u8(self.kind as u8); |
71 | 258k | dst.put_u8(self.flag); |
72 | 258k | dst.put_u32(self.stream_id.into()); |
73 | 258k | } <h2::frame::head::Head>::encode::<bytes::buf::limit::Limit<&mut bytes::bytes_mut::BytesMut>> Line | Count | Source | 66 | 208k | pub fn encode<T: BufMut>(&self, payload_len: usize, dst: &mut T) { | 67 | 208k | debug_assert!(self.encode_len() <= dst.remaining_mut()); | 68 | | | 69 | 208k | dst.put_uint(payload_len as u64, 3); | 70 | 208k | dst.put_u8(self.kind as u8); | 71 | 208k | dst.put_u8(self.flag); | 72 | 208k | dst.put_u32(self.stream_id.into()); | 73 | 208k | } |
<h2::frame::head::Head>::encode::<bytes::bytes_mut::BytesMut> Line | Count | Source | 66 | 50.3k | pub fn encode<T: BufMut>(&self, payload_len: usize, dst: &mut T) { | 67 | 50.3k | debug_assert!(self.encode_len() <= dst.remaining_mut()); | 68 | | | 69 | 50.3k | dst.put_uint(payload_len as u64, 3); | 70 | 50.3k | dst.put_u8(self.kind as u8); | 71 | 50.3k | dst.put_u8(self.flag); | 72 | 50.3k | dst.put_u32(self.stream_id.into()); | 73 | 50.3k | } |
|
74 | | } |
75 | | |
76 | | // ===== impl Kind ===== |
77 | | |
78 | | impl Kind { |
79 | 155k | pub fn new(byte: u8) -> Kind { |
80 | 155k | match byte { |
81 | 64.5k | 0 => Kind::Data, |
82 | 48.4k | 1 => Kind::Headers, |
83 | 493 | 2 => Kind::Priority, |
84 | 1.77k | 3 => Kind::Reset, |
85 | 6.79k | 4 => Kind::Settings, |
86 | 2.61k | 5 => Kind::PushPromise, |
87 | 637 | 6 => Kind::Ping, |
88 | 5.30k | 7 => Kind::GoAway, |
89 | 1.83k | 8 => Kind::WindowUpdate, |
90 | 12.1k | 9 => Kind::Continuation, |
91 | 10.7k | _ => Kind::Unknown, |
92 | | } |
93 | 155k | } |
94 | | } |