1use core::fmt;
2
3use std::error;
4
5use super::proto::OpCode;
6
7#[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#[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 {}