websocketpp  0.4.0
C++/Boost Asio based websocket client/server library
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Pages
close.hpp
Go to the documentation of this file.
1 
2 /*
3  * Copyright (c) 2014, Peter Thorson. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  * * Redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer.
9  * * Redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution.
12  * * Neither the name of the WebSocket++ Project nor the
13  * names of its contributors may be used to endorse or promote products
14  * derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON BE LIABLE FOR ANY
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  *
27  */
28 
29 #ifndef WEBSOCKETPP_CLOSE_HPP
30 #define WEBSOCKETPP_CLOSE_HPP
31 
36 #include <websocketpp/error.hpp>
37 #include <websocketpp/common/network.hpp>
38 #include <websocketpp/common/stdint.hpp>
39 #include <websocketpp/utf8_validator.hpp>
40 
41 #include <string>
42 
43 namespace websocketpp {
45 namespace close {
47 namespace status {
49  typedef uint16_t value;
50 
52  static value const blank = 0;
53 
55 
62  static value const omit_handshake = 1;
63 
65 
72  static value const force_tcp_drop = 2;
73 
76  static value const normal = 1000;
77 
80  static value const going_away = 1001;
81 
83  static value const protocol_error = 1002;
84 
87 
91  static value const unsupported_data = 1003;
92 
94 
97  static value const no_status = 1005;
98 
100 
104  static value const abnormal_close = 1006;
105 
107 
110  static value const invalid_payload = 1007;
111 
113 
118  static value const policy_violation = 1008;
119 
121  static value const message_too_big = 1009;
122 
124 
129  static value const extension_required = 1010;
130 
133  static value const internal_endpoint_error = 1011;
134 
138  static value const service_restart = 1012;
139 
143  static value const try_again_later = 1013;
144 
146 
152  static value const tls_handshake = 1015;
153 
155  static value const rsv_start = 1016;
157  static value const rsv_end = 2999;
158 
160 
164  inline bool reserved(value code) {
165  return ((code >= rsv_start && code <= rsv_end) ||
166  code == 1004 || code == 1014);
167  }
168 
170  static value const invalid_low = 999;
172  static value const invalid_high = 5000;
173 
175 
179  inline bool invalid(value code) {
180  return (code <= invalid_low || code >= invalid_high ||
181  code == no_status || code == abnormal_close ||
182  code == tls_handshake);
183  }
184 
186 
197  inline bool terminal(value code) {
198  return (code == protocol_error || code == invalid_payload ||
199  code == policy_violation || code == message_too_big ||
200  code == internal_endpoint_error);
201  }
202 
204 
212  inline std::string get_string(value code) {
213  switch (code) {
214  case normal:
215  return "Normal close";
216  case going_away:
217  return "Going away";
218  case protocol_error:
219  return "Protocol error";
220  case unsupported_data:
221  return "Unsupported data";
222  case no_status:
223  return "No status set";
224  case abnormal_close:
225  return "Abnormal close";
226  case invalid_payload:
227  return "Invalid payload";
228  case policy_violation:
229  return "Policy violoation";
230  case message_too_big:
231  return "Message too big";
232  case extension_required:
233  return "Extension required";
234  case internal_endpoint_error:
235  return "Internal endpoint error";
236  case tls_handshake:
237  return "TLS handshake failure";
238  default:
239  return "Unknown";
240  }
241  }
242 } // namespace status
243 
246  uint16_t i;
247  char c[2];
248 };
249 
251 
264 inline status::value extract_code(std::string const & payload, lib::error_code
265  & ec)
266 {
267  ec = lib::error_code();
268 
269  if (payload.size() == 0) {
270  return status::no_status;
271  } else if (payload.size() == 1) {
272  ec = make_error_code(error::bad_close_code);
273  return status::protocol_error;
274  }
275 
276  code_converter val;
277 
278  val.c[0] = payload[0];
279  val.c[1] = payload[1];
280 
281  status::value code(ntohs(val.i));
282 
283  if (status::invalid(code)) {
284  ec = make_error_code(error::invalid_close_code);
285  }
286 
287  if (status::reserved(code)) {
288  ec = make_error_code(error::reserved_close_code);
289  }
290 
291  return code;
292 }
293 
295 
303 inline std::string extract_reason(std::string const & payload, lib::error_code
304  & ec)
305 {
306  std::string reason = "";
307  ec = lib::error_code();
308 
309  if (payload.size() > 2) {
310  reason.append(payload.begin()+2,payload.end());
311  }
312 
313  if (!websocketpp::utf8_validator::validate(reason)) {
314  ec = make_error_code(error::invalid_utf8);
315  }
316 
317  return reason;
318 }
319 
320 } // namespace close
321 } // namespace websocketpp
322 
323 #endif // WEBSOCKETPP_CLOSE_HPP
static value const internal_endpoint_error
Definition: close.hpp:133
uint16_t value
The type of a close code value.
Definition: close.hpp:49
static value const invalid_payload
An endpoint received message data inconsistent with its type.
Definition: close.hpp:110
bool terminal(value code)
Determine if the code represents an unrecoverable error.
Definition: close.hpp:197
static value const extension_required
A client expected the server to accept a required extension request.
Definition: close.hpp:129
static value const try_again_later
Definition: close.hpp:143
static value const invalid_high
Last value in range that is always invalid on the wire.
Definition: close.hpp:172
bool reserved(value code)
Test whether a close code is in a reserved range.
Definition: close.hpp:164
static value const protocol_error
A protocol error occurred.
Definition: close.hpp:83
static value const normal
Definition: close.hpp:76
static value const invalid_low
First value in range that is always invalid on the wire.
Definition: close.hpp:170
Close code is invalid.
Definition: error.hpp:81
status::value extract_code(std::string const &payload, lib::error_code &ec)
Extract a close code value from a close payload.
Definition: close.hpp:264
static value const policy_violation
An endpoint received a message that violated its policy.
Definition: close.hpp:118
static value const tls_handshake
An endpoint failed to perform a TLS handshake.
Definition: close.hpp:152
bool invalid(value code)
Test whether a close code is invalid on the wire.
Definition: close.hpp:179
Unable to parse close code.
Definition: error.hpp:75
static value const unsupported_data
Definition: close.hpp:91
Close code is in a reserved range.
Definition: error.hpp:78
static value const rsv_start
First value in range reserved for future protocol use.
Definition: close.hpp:155
Namespace for the WebSocket++ project.
Definition: base64.hpp:41
static value const going_away
Definition: close.hpp:80
static value const service_restart
Definition: close.hpp:138
static value const omit_handshake
Close the connection without a WebSocket close handshake.
Definition: close.hpp:62
static value const rsv_end
Last value in range reserved for future protocol use.
Definition: close.hpp:157
static value const no_status
A dummy value to indicate that no status code was received.
Definition: close.hpp:97
static value const message_too_big
An endpoint received a message too large to process.
Definition: close.hpp:121
static value const force_tcp_drop
Close the connection with a forced TCP drop.
Definition: close.hpp:72
std::string get_string(value code)
Return a human readable interpretation of a WebSocket close code.
Definition: close.hpp:212
static value const abnormal_close
A dummy value to indicate that the connection was closed abnormally.
Definition: close.hpp:104
Type used to convert close statuses between integer and wire representations.
Definition: close.hpp:245
std::string extract_reason(std::string const &payload, lib::error_code &ec)
Extract the reason string from a close payload.
Definition: close.hpp:303
static value const blank
A blank value for internal use.
Definition: close.hpp:52