Coverage Report

Created: 2026-03-20 06:45

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
}