Coverage Report

Created: 2026-10-28 07:03

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
267k
    pub fn new(kind: Kind, flag: u8, stream_id: StreamId) -> Head {
32
267k
        Head {
33
267k
            kind,
34
267k
            flag,
35
267k
            stream_id,
36
267k
        }
37
267k
    }
38
39
    /// Parse an HTTP/2 frame header
40
88.6k
    pub fn parse(header: &[u8]) -> Head {
41
88.6k
        let (stream_id, _) = StreamId::parse(&header[5..]);
42
43
88.6k
        Head {
44
88.6k
            kind: Kind::new(header[3]),
45
88.6k
            flag: header[4],
46
88.6k
            stream_id,
47
88.6k
        }
48
88.6k
    }
49
50
179k
    pub fn stream_id(&self) -> StreamId {
51
179k
        self.stream_id
52
179k
    }
53
54
99.0k
    pub fn kind(&self) -> Kind {
55
99.0k
        self.kind
56
99.0k
    }
57
58
78.5k
    pub fn flag(&self) -> u8 {
59
78.5k
        self.flag
60
78.5k
    }
61
62
0
    pub fn encode_len(&self) -> usize {
63
0
        super::HEADER_LEN
64
0
    }
65
66
267k
    pub fn encode<T: BufMut>(&self, payload_len: usize, dst: &mut T) {
67
267k
        debug_assert!(self.encode_len() <= dst.remaining_mut());
68
69
267k
        dst.put_uint(payload_len as u64, 3);
70
267k
        dst.put_u8(self.kind as u8);
71
267k
        dst.put_u8(self.flag);
72
267k
        dst.put_u32(self.stream_id.into());
73
267k
    }
<h2::frame::head::Head>::encode::<bytes::buf::limit::Limit<&mut bytes::bytes_mut::BytesMut>>
Line
Count
Source
66
218k
    pub fn encode<T: BufMut>(&self, payload_len: usize, dst: &mut T) {
67
218k
        debug_assert!(self.encode_len() <= dst.remaining_mut());
68
69
218k
        dst.put_uint(payload_len as u64, 3);
70
218k
        dst.put_u8(self.kind as u8);
71
218k
        dst.put_u8(self.flag);
72
218k
        dst.put_u32(self.stream_id.into());
73
218k
    }
<h2::frame::head::Head>::encode::<bytes::bytes_mut::BytesMut>
Line
Count
Source
66
48.6k
    pub fn encode<T: BufMut>(&self, payload_len: usize, dst: &mut T) {
67
48.6k
        debug_assert!(self.encode_len() <= dst.remaining_mut());
68
69
48.6k
        dst.put_uint(payload_len as u64, 3);
70
48.6k
        dst.put_u8(self.kind as u8);
71
48.6k
        dst.put_u8(self.flag);
72
48.6k
        dst.put_u32(self.stream_id.into());
73
48.6k
    }
74
}
75
76
// ===== impl Kind =====
77
78
impl Kind {
79
88.6k
    pub fn new(byte: u8) -> Kind {
80
88.6k
        match byte {
81
18.6k
            0 => Kind::Data,
82
40.7k
            1 => Kind::Headers,
83
206
            2 => Kind::Priority,
84
1.11k
            3 => Kind::Reset,
85
5.93k
            4 => Kind::Settings,
86
2.52k
            5 => Kind::PushPromise,
87
392
            6 => Kind::Ping,
88
1.55k
            7 => Kind::GoAway,
89
2.09k
            8 => Kind::WindowUpdate,
90
10.4k
            9 => Kind::Continuation,
91
5.02k
            _ => Kind::Unknown,
92
        }
93
88.6k
    }
94
}