/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 | | } |