WebSocket++ 0.8.2
C++ websocket client/server library
Loading...
Searching...
No Matches
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
43namespace websocketpp {
45namespace close {
47namespace 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
148 static value const bad_gateway = 1014;
149
151
157 static value const tls_handshake = 1015;
158
160
165 static value const subprotocol_error = 3000;
166
168
172 static value const invalid_subprotocol_data = 3001;
173
175 static value const rsv_start = 1016;
177 static value const rsv_end = 2999;
178
180
184 inline bool reserved(value code) {
185 return ((code >= rsv_start && code <= rsv_end) ||
186 code == 1004);
187 }
188
190 static value const invalid_low = 999;
192 static value const invalid_high = 5000;
193
195
199 inline bool invalid(value code) {
200 return (code <= invalid_low || code >= invalid_high ||
201 code == no_status || code == abnormal_close ||
202 code == tls_handshake);
203 }
204
206
217 inline bool terminal(value code) {
218 return (code == protocol_error || code == invalid_payload ||
219 code == policy_violation || code == message_too_big ||
221 }
222
224
232 inline std::string get_string(value code) {
233 switch (code) {
234 case normal:
235 return "Normal close";
236 case going_away:
237 return "Going away";
238 case protocol_error:
239 return "Protocol error";
240 case unsupported_data:
241 return "Unsupported data";
242 case no_status:
243 return "No status set";
244 case abnormal_close:
245 return "Abnormal close";
246 case invalid_payload:
247 return "Invalid payload";
248 case policy_violation:
249 return "Policy violoation";
250 case message_too_big:
251 return "Message too big";
253 return "Extension required";
255 return "Internal endpoint error";
256 case service_restart:
257 return "Service restart";
258 case try_again_later:
259 return "Try again later";
260 case bad_gateway:
261 return "Bad gateway";
262 case tls_handshake:
263 return "TLS handshake failure";
265 return "Generic subprotocol error";
267 return "Invalid subprotocol data";
268 default:
269 return "Unknown";
270 }
271 }
272} // namespace status
273
276 uint16_t i;
277 char c[2];
278};
279
281
294inline status::value extract_code(std::string const & payload, lib::error_code
295 & ec)
296{
297 ec = lib::error_code();
298
299 if (payload.size() == 0) {
300 return status::no_status;
301 } else if (payload.size() == 1) {
302 ec = make_error_code(error::bad_close_code);
304 }
305
306 code_converter val;
307
308 val.c[0] = payload[0];
309 val.c[1] = payload[1];
310
311 status::value code(ntohs(val.i));
312
313 if (status::invalid(code)) {
314 ec = make_error_code(error::invalid_close_code);
315 }
316
317 if (status::reserved(code)) {
318 ec = make_error_code(error::reserved_close_code);
319 }
320
321 return code;
322}
323
325
333inline std::string extract_reason(std::string const & payload, lib::error_code
334 & ec)
335{
336 std::string reason;
337 ec = lib::error_code();
338
339 if (payload.size() > 2) {
340 reason.append(payload.begin()+2,payload.end());
341 }
342
343 if (!websocketpp::utf8_validator::validate(reason)) {
344 ec = make_error_code(error::invalid_utf8);
345 }
346
347 return reason;
348}
349
350} // namespace close
351} // namespace websocketpp
352
353#endif // WEBSOCKETPP_CLOSE_HPP
static value const service_restart
Definition close.hpp:138
static value const message_too_big
An endpoint received a message too large to process.
Definition close.hpp:121
static value const try_again_later
Definition close.hpp:143
static value const force_tcp_drop
Close the connection with a forced TCP drop.
Definition close.hpp:72
static value const tls_handshake
An endpoint failed to perform a TLS handshake.
Definition close.hpp:157
static value const rsv_end
Last value in range reserved for future protocol use.
Definition close.hpp:177
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:217
static value const protocol_error
A protocol error occurred.
Definition close.hpp:83
std::string get_string(value code)
Return a human readable interpretation of a WebSocket close code.
Definition close.hpp:232
static value const bad_gateway
Definition close.hpp:148
static value const invalid_subprotocol_data
A invalid subprotocol data.
Definition close.hpp:172
static value const invalid_high
Last value in range that is always invalid on the wire.
Definition close.hpp:192
static value const unsupported_data
Definition close.hpp:91
static value const no_status
A dummy value to indicate that no status code was received.
Definition close.hpp:97
static value const omit_handshake
Close the connection without a WebSocket close handshake.
Definition close.hpp:62
static value const normal
Definition close.hpp:76
static value const blank
A blank value for internal use.
Definition close.hpp:52
static value const invalid_low
First value in range that is always invalid on the wire.
Definition close.hpp:190
static value const abnormal_close
A dummy value to indicate that the connection was closed abnormally.
Definition close.hpp:104
static value const rsv_start
First value in range reserved for future protocol use.
Definition close.hpp:175
uint16_t value
The type of a close code value.
Definition close.hpp:49
static value const policy_violation
An endpoint received a message that violated its policy.
Definition close.hpp:118
static value const extension_required
A client expected the server to accept a required extension request.
Definition close.hpp:129
bool invalid(value code)
Test whether a close code is invalid on the wire.
Definition close.hpp:199
static value const internal_endpoint_error
Definition close.hpp:133
static value const subprotocol_error
A generic subprotocol error.
Definition close.hpp:165
bool reserved(value code)
Test whether a close code is in a reserved range.
Definition close.hpp:184
static value const going_away
Definition close.hpp:80
std::string extract_reason(std::string const &payload, lib::error_code &ec)
Extract the reason string from a close payload.
Definition close.hpp:333
status::value extract_code(std::string const &payload, lib::error_code &ec)
Extract a close code value from a close payload.
Definition close.hpp:294
@ reserved_close_code
Close code is in a reserved range.
Definition error.hpp:80
@ invalid_utf8
Invalid UTF-8.
Definition error.hpp:86
@ invalid_close_code
Close code is invalid.
Definition error.hpp:83
@ bad_close_code
Unable to parse close code.
Definition error.hpp:77
Namespace for the WebSocket++ project.
Definition base64.hpp:41
Type used to convert close statuses between integer and wire representations.
Definition close.hpp:275