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 | |
54 | // ===== impl SendError ===== |
55 | |
56 | impl error::Error for SendError {} |
57 | |
58 | impl fmt::Display for SendError { |
59 | fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { |
60 | match *self { |
61 | Self::Connection(ref e: &Error) => e.fmt(fmt), |
62 | Self::User(ref e: &UserError) => e.fmt(fmt), |
63 | } |
64 | } |
65 | } |
66 | |
67 | impl From<io::Error> for SendError { |
68 | fn from(src: io::Error) -> Self { |
69 | Self::Connection(src.into()) |
70 | } |
71 | } |
72 | |
73 | impl From<UserError> for SendError { |
74 | fn from(src: UserError) -> Self { |
75 | SendError::User(src) |
76 | } |
77 | } |
78 | |
79 | // ===== impl UserError ===== |
80 | |
81 | impl error::Error for UserError {} |
82 | |
83 | impl fmt::Display for UserError { |
84 | fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { |
85 | use self::UserError::*; |
86 | |
87 | fmt.write_str(data:match *self { |
88 | InactiveStreamId => "inactive stream" , |
89 | UnexpectedFrameType => "unexpected frame type" , |
90 | PayloadTooBig => "payload too big" , |
91 | Rejected => "rejected" , |
92 | ReleaseCapacityTooBig => "release capacity too big" , |
93 | OverflowedStreamId => "stream ID overflowed" , |
94 | MalformedHeaders => "malformed headers" , |
95 | MissingUriSchemeAndAuthority => "request URI missing scheme and authority" , |
96 | PollResetAfterSendResponse => "poll_reset after send_response is illegal" , |
97 | SendPingWhilePending => "send_ping before received previous pong" , |
98 | SendSettingsWhilePending => "sending SETTINGS before received previous ACK" , |
99 | PeerDisabledServerPush => "sending PUSH_PROMISE to peer who disabled server push" , |
100 | }) |
101 | } |
102 | } |
103 | |