http_ws/
error.rs

1use core::fmt;
2
3use std::error;
4
5use super::proto::OpCode;
6
7/// WebSocket protocol errors.
8#[derive(Debug)]
9pub enum ProtocolError {
10    UnmaskedFrame,
11    MaskedFrame,
12    InvalidOpcode(u8),
13    InvalidLength(usize),
14    BadOpCode,
15    Overflow,
16    ContinuationNotStarted,
17    ContinuationStarted,
18    ContinuationFragment(OpCode),
19    Closed,
20}
21
22impl fmt::Display for ProtocolError {
23    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
24        match *self {
25            Self::UnmaskedFrame => f.write_str("Received an unmasked frame from client."),
26            Self::MaskedFrame => f.write_str("Received a masked frame from server."),
27            Self::InvalidOpcode(code) => write!(f, " Encountered invalid OpCode: {code}"),
28            Self::InvalidLength(len) => write!(f, "Invalid control frame length: {len}."),
29            Self::BadOpCode => f.write_str("Bad opcode."),
30            Self::Overflow => f.write_str("A payload reached size limit."),
31            Self::ContinuationNotStarted => f.write_str("Continuation is not started."),
32            Self::ContinuationStarted => f.write_str("Received new continuation but it is already started."),
33            Self::ContinuationFragment(ref code) => write!(f, "Unknown continuation fragment with OpCode: {code}."),
34            Self::Closed => f.write_str("Connection already closed."),
35        }
36    }
37}
38
39impl error::Error for ProtocolError {}
40
41impl From<OpCode> for ProtocolError {
42    fn from(e: OpCode) -> Self {
43        Self::ContinuationFragment(e)
44    }
45}
46
47/// WebSocket handshake errors
48#[derive(Debug, Eq, PartialEq)]
49pub enum HandshakeError {
50    GetMethodRequired,
51    ConnectMethodRequired,
52    NoWebsocketUpgrade,
53    NoConnectionUpgrade,
54    NoVersionHeader,
55    UnsupportedVersion,
56    BadWebsocketKey,
57}
58
59impl fmt::Display for HandshakeError {
60    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
61        match *self {
62            Self::GetMethodRequired => f.write_str("Only GET method is allowed for HTTP/1.1 websocket."),
63            Self::ConnectMethodRequired => f.write_str("Only CONNECT method is allowed HTTP/2 websocket."),
64            Self::NoWebsocketUpgrade => f.write_str("Upgrade header is not set to HTTP/1.1 websocket."),
65            Self::NoConnectionUpgrade => f.write_str("Connection header is not set to HTTP/1.1 websocket."),
66            Self::NoVersionHeader => f.write_str(" WebSocket version header is not set to HTTP/1.1 websocket."),
67            Self::UnsupportedVersion => f.write_str("Unsupported WebSocket version."),
68            Self::BadWebsocketKey => f.write_str("WebSocket key is not set or wrong to HTTP/1.1 websocket."),
69        }
70    }
71}
72
73impl error::Error for HandshakeError {}