2 * Copyright (c) 2014, Peter Thorson. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 * * Redistributions of source code must retain the above copyright
7 * notice, this list of conditions and the following disclaimer.
8 * * Redistributions in binary form must reproduce the above copyright
9 * notice, this list of conditions and the following disclaimer in the
10 * documentation and/or other materials provided with the distribution.
11 * * Neither the name of the WebSocket++ Project nor the
12 * names of its contributors may be used to endorse or promote products
13 * derived from this software without specific prior written permission.
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON BE LIABLE FOR ANY
19 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 #ifndef WEBSOCKETPP_ERROR_HPP
29 #define WEBSOCKETPP_ERROR_HPP
35 #include <websocketpp/common/cpp11.hpp>
36 #include <websocketpp/common/system_error.hpp>
38 namespace websocketpp {
40 /// Combination error code / string type for returning two values
41 typedef std::pair<lib::error_code,std::string> err_str_pair;
43 /// Library level error codes
46 /// Catch-all library error
49 /// send attempted when endpoint write queue was full
52 /// Attempted an operation using a payload that was improperly formatted
53 /// ex: invalid UTF8 encoding on a text message.
56 /// Attempted to open a secure connection with an insecure endpoint
59 /// Attempted an operation that required an endpoint that is no longer
60 /// available. This is usually because the endpoint went out of scope
61 /// before a connection that it created.
64 /// An invalid uri was supplied
67 /// The endpoint is out of outgoing message buffers
70 /// The endpoint is out of incoming message buffers
73 /// The connection was in the wrong state for this operation
76 /// Unable to parse close code
79 /// Close code is in a reserved range
82 /// Close code is invalid
88 /// Invalid subprotocol
91 /// An operation was attempted on a connection that did not exist or was
95 /// Unit testing utility error code
98 /// Connection creation attempted failed
101 /// Selected subprotocol was not requested by the client
102 unrequested_subprotocol,
104 /// Attempted to use a client specific feature on a server endpoint
107 /// Attempted to use a server specific feature on a client endpoint
110 /// HTTP connection ended
111 http_connection_ended,
113 /// WebSocket opening handshake timed out
114 open_handshake_timeout,
116 /// WebSocket close handshake timed out
117 close_handshake_timeout,
119 /// Invalid port in URI
122 /// An async accept operation failed because the underlying transport has been
123 /// requested to not listen for new connections anymore.
124 async_accept_not_listening,
126 /// The requested operation was canceled
129 /// Connection rejected
132 /// Upgrade Required. This happens if an HTTP request is made to a
133 /// WebSocket++ server that doesn't implement an http handler
136 /// Invalid WebSocket protocol version
139 /// Unsupported WebSocket protocol version
145 /// Extension negotiation failed
150 class category : public lib::error_category {
154 char const * name() const _WEBSOCKETPP_NOEXCEPT_TOKEN_ {
155 return "websocketpp";
158 std::string message(int value) const {
161 return "Generic error";
162 case error::send_queue_full:
163 return "send queue full";
164 case error::payload_violation:
165 return "payload violation";
166 case error::endpoint_not_secure:
167 return "endpoint not secure";
168 case error::endpoint_unavailable:
169 return "endpoint not available";
170 case error::invalid_uri:
171 return "invalid uri";
172 case error::no_outgoing_buffers:
173 return "no outgoing message buffers";
174 case error::no_incoming_buffers:
175 return "no incoming message buffers";
176 case error::invalid_state:
177 return "invalid state";
178 case error::bad_close_code:
179 return "Unable to extract close code";
180 case error::invalid_close_code:
181 return "Extracted close code is in an invalid range";
182 case error::reserved_close_code:
183 return "Extracted close code is in a reserved range";
184 case error::invalid_utf8:
185 return "Invalid UTF-8";
186 case error::invalid_subprotocol:
187 return "Invalid subprotocol";
188 case error::bad_connection:
189 return "Bad Connection";
192 case error::con_creation_failed:
193 return "Connection creation attempt failed";
194 case error::unrequested_subprotocol:
195 return "Selected subprotocol was not requested by the client";
196 case error::client_only:
197 return "Feature not available on server endpoints";
198 case error::server_only:
199 return "Feature not available on client endpoints";
200 case error::http_connection_ended:
201 return "HTTP connection ended";
202 case error::open_handshake_timeout:
203 return "The opening handshake timed out";
204 case error::close_handshake_timeout:
205 return "The closing handshake timed out";
206 case error::invalid_port:
207 return "Invalid URI port";
208 case error::async_accept_not_listening:
209 return "Async Accept not listening";
210 case error::operation_canceled:
211 return "Operation canceled";
212 case error::rejected:
213 return "Connection rejected";
214 case error::upgrade_required:
215 return "Upgrade required";
216 case error::invalid_version:
217 return "Invalid version";
218 case error::unsupported_version:
219 return "Unsupported version";
220 case error::http_parse_error:
221 return "HTTP parse error";
222 case error::extension_neg_failed:
223 return "Extension negotiation failed";
230 inline const lib::error_category& get_category() {
231 static category instance;
235 inline lib::error_code make_error_code(error::value e) {
236 return lib::error_code(static_cast<int>(e), get_category());
240 } // namespace websocketpp
242 _WEBSOCKETPP_ERROR_CODE_ENUM_NS_START_
243 template<> struct is_error_code_enum<websocketpp::error::value>
245 static bool const value = true;
247 _WEBSOCKETPP_ERROR_CODE_ENUM_NS_END_
249 namespace websocketpp {
251 class exception : public std::exception {
253 exception(std::string const & msg, lib::error_code ec = make_error_code(error::general))
254 : m_msg(msg.empty() ? ec.message() : msg), m_code(ec)
257 explicit exception(lib::error_code ec)
258 : m_msg(ec.message()), m_code(ec)
261 ~exception() throw() {}
263 virtual char const * what() const throw() {
264 return m_msg.c_str();
267 lib::error_code code() const throw() {
271 const std::string m_msg;
272 lib::error_code m_code;
275 } // namespace websocketpp
277 #endif // WEBSOCKETPP_ERROR_HPP