Coverage Report

Created: 2026-02-26 06:09

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/h2/src/codec/error.rs
Line
Count
Source
1
use crate::proto::Error;
2
3
use std::{error, fmt, io};
4
5
/// Errors caused by sending a message
6
#[derive(Debug)]
7
pub enum SendError {
8
    Connection(Error),
9
    User(UserError),
10
}
11
12
/// Errors caused by users of the library
13
#[derive(Debug)]
14
pub enum UserError {
15
    /// The stream ID is no longer accepting frames.
16
    InactiveStreamId,
17
18
    /// The stream is not currently expecting a frame of this type.
19
    UnexpectedFrameType,
20
21
    /// The payload size is too big
22
    PayloadTooBig,
23
24
    /// The application attempted to initiate too many streams to remote.
25
    Rejected,
26
27
    /// The released capacity is larger than claimed capacity.
28
    ReleaseCapacityTooBig,
29
30
    /// The stream ID space is overflowed.
31
    ///
32
    /// A new connection is needed.
33
    OverflowedStreamId,
34
35
    /// Illegal headers, such as connection-specific headers.
36
    MalformedHeaders,
37
38
    /// Request submitted with relative URI.
39
    MissingUriSchemeAndAuthority,
40
41
    /// Calls `SendResponse::poll_reset` after having called `send_response`.
42
    PollResetAfterSendResponse,
43
44
    /// Calls `PingPong::send_ping` before receiving a pong.
45
    SendPingWhilePending,
46
47
    /// Tries to update local SETTINGS while ACK has not been received.
48
    SendSettingsWhilePending,
49
50
    /// Tries to send push promise to peer who has disabled server push
51
    PeerDisabledServerPush,
52
53
    /// Invalid status code for informational response (must be 1xx)
54
    InvalidInformationalStatusCode,
55
}
56
57
// ===== impl SendError =====
58
59
impl error::Error for SendError {}
60
61
impl fmt::Display for SendError {
62
0
    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
63
0
        match *self {
64
0
            Self::Connection(ref e) => e.fmt(fmt),
65
0
            Self::User(ref e) => e.fmt(fmt),
66
        }
67
0
    }
68
}
69
70
impl From<io::Error> for SendError {
71
0
    fn from(src: io::Error) -> Self {
72
0
        Self::Connection(src.into())
73
0
    }
74
}
75
76
impl From<UserError> for SendError {
77
80
    fn from(src: UserError) -> Self {
78
80
        SendError::User(src)
79
80
    }
80
}
81
82
// ===== impl UserError =====
83
84
impl error::Error for UserError {}
85
86
impl fmt::Display for UserError {
87
0
    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
88
        use self::UserError::*;
89
90
0
        fmt.write_str(match *self {
91
0
            InactiveStreamId => "inactive stream",
92
0
            UnexpectedFrameType => "unexpected frame type",
93
0
            PayloadTooBig => "payload too big",
94
0
            Rejected => "rejected",
95
0
            ReleaseCapacityTooBig => "release capacity too big",
96
0
            OverflowedStreamId => "stream ID overflowed",
97
0
            MalformedHeaders => "malformed headers",
98
0
            MissingUriSchemeAndAuthority => "request URI missing scheme and authority",
99
0
            PollResetAfterSendResponse => "poll_reset after send_response is illegal",
100
0
            SendPingWhilePending => "send_ping before received previous pong",
101
0
            SendSettingsWhilePending => "sending SETTINGS before received previous ACK",
102
0
            PeerDisabledServerPush => "sending PUSH_PROMISE to peer who disabled server push",
103
0
            InvalidInformationalStatusCode => "invalid informational status code",
104
        })
105
0
    }
106
}