websocketpp  0.6.0
C++/Boost Asio based websocket client/server library
connection.hpp
1 /*
2  * Copyright (c) 2014, Peter Thorson. All rights reserved.
3  *
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.
14  *
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.
25  *
26  */
27 
28 #ifndef WEBSOCKETPP_CONNECTION_HPP
29 #define WEBSOCKETPP_CONNECTION_HPP
30 
31 #include <websocketpp/close.hpp>
32 #include <websocketpp/error.hpp>
33 #include <websocketpp/frame.hpp>
34 
35 #include <websocketpp/logger/levels.hpp>
36 #include <websocketpp/processors/processor.hpp>
37 #include <websocketpp/transport/base/connection.hpp>
38 #include <websocketpp/http/constants.hpp>
39 
40 #include <websocketpp/common/connection_hdl.hpp>
41 #include <websocketpp/common/cpp11.hpp>
42 #include <websocketpp/common/functional.hpp>
43 
44 #include <queue>
45 #include <sstream>
46 #include <string>
47 #include <vector>
48 
49 namespace websocketpp {
50 
52 
59 typedef lib::function<void(connection_hdl)> open_handler;
60 
62 
69 typedef lib::function<void(connection_hdl)> close_handler;
70 
72 
79 typedef lib::function<void(connection_hdl)> fail_handler;
80 
82 
91 typedef lib::function<void(connection_hdl)> interrupt_handler;
92 
94 
101 typedef lib::function<bool(connection_hdl,std::string)> ping_handler;
102 
104 
109 typedef lib::function<void(connection_hdl,std::string)> pong_handler;
110 
112 
116 typedef lib::function<void(connection_hdl,std::string)> pong_timeout_handler;
117 
119 
129 typedef lib::function<bool(connection_hdl)> validate_handler;
130 
132 
151 typedef lib::function<void(connection_hdl)> http_handler;
152 
153 //
154 typedef lib::function<void(lib::error_code const & ec, size_t bytes_transferred)> read_handler;
155 typedef lib::function<void(lib::error_code const & ec)> write_frame_handler;
156 
157 // constants related to the default WebSocket protocol versions available
158 #ifdef _WEBSOCKETPP_INITIALIZER_LISTS_ // simplified C++11 version
159 
164  static std::vector<int> const versions_supported = {0,7,8,13};
165 #else
166  static int const helper[] = {0,7,8,13};
169 
173  static std::vector<int> const versions_supported(helper,helper+4);
174 #endif
175 
176 namespace session {
177 namespace state {
178  // externally visible session state (states based on the RFC)
179  enum value {
180  connecting = 0,
181  open = 1,
182  closing = 2,
183  closed = 3
184  };
185 } // namespace state
186 
187 
188 namespace fail {
189 namespace status {
190  enum value {
191  GOOD = 0, // no failure yet!
192  SYSTEM = 1, // system call returned error, check that code
193  WEBSOCKET = 2, // websocket close codes contain error
194  UNKNOWN = 3, // No failure information is available
195  TIMEOUT_TLS = 4, // TLS handshake timed out
196  TIMEOUT_WS = 5 // WS handshake timed out
197  };
198 } // namespace status
199 } // namespace fail
200 
201 namespace internal_state {
202  // More granular internal states. These are used for multi-threaded
203  // connection synchronization and preventing values that are not yet or no
204  // longer available from being used.
205 
206  enum value {
207  USER_INIT = 0,
208  TRANSPORT_INIT = 1,
209  READ_HTTP_REQUEST = 2,
210  WRITE_HTTP_REQUEST = 3,
211  READ_HTTP_RESPONSE = 4,
212  WRITE_HTTP_RESPONSE = 5,
213  PROCESS_HTTP_REQUEST = 6,
214  PROCESS_CONNECTION = 7
215  };
216 } // namespace internal_state
217 
218 
219 namespace http_state {
220  // states to keep track of the progress of http connections
221 
222  enum value {
223  init = 0,
224  deferred = 1,
225  headers_written = 2,
226  body_written = 3,
227  closed = 4
228  };
229 } // namespace http_state
230 
231 } // namespace session
232 
234 template <typename config>
236  : public config::transport_type::transport_con_type
237  , public config::connection_base
238 {
239 public:
243  typedef lib::shared_ptr<type> ptr;
245  typedef lib::weak_ptr<type> weak_ptr;
246 
248  typedef typename config::concurrency_type concurrency_type;
250  typedef typename config::alog_type alog_type;
252  typedef typename config::elog_type elog_type;
253 
255  typedef typename config::transport_type::transport_con_type
258  typedef typename transport_con_type::ptr transport_con_ptr;
259 
260  typedef lib::function<void(ptr)> termination_handler;
261 
262  typedef typename concurrency_type::scoped_lock_type scoped_lock_type;
263  typedef typename concurrency_type::mutex_type mutex_type;
264 
265  typedef typename config::request_type request_type;
266  typedef typename config::response_type response_type;
267 
268  typedef typename config::message_type message_type;
269  typedef typename message_type::ptr message_ptr;
270 
271  typedef typename config::con_msg_manager_type con_msg_manager_type;
272  typedef typename con_msg_manager_type::ptr con_msg_manager_ptr;
273 
275  typedef typename config::rng_type rng_type;
276 
278  typedef lib::shared_ptr<processor_type> processor_ptr;
279 
280  // Message handler (needs to know message type)
281  typedef lib::function<void(connection_hdl,message_ptr)> message_handler;
282 
284  typedef typename transport_con_type::timer_ptr timer_ptr;
285 
286  // Misc Convenience Types
287  typedef session::internal_state::value istate_type;
288 
289 private:
290  enum terminate_status {
291  failed = 1,
292  closed,
293  unknown
294  };
295 public:
296 
297  explicit connection(bool p_is_server, std::string const & ua, alog_type& alog,
298  elog_type& elog, rng_type & rng)
299  : transport_con_type(p_is_server, alog, elog)
300  , m_handle_read_frame(lib::bind(
301  &type::handle_read_frame,
302  this,
303  lib::placeholders::_1,
304  lib::placeholders::_2
305  ))
306  , m_write_frame_handler(lib::bind(
307  &type::handle_write_frame,
308  this,
309  lib::placeholders::_1
310  ))
311  , m_user_agent(ua)
312  , m_open_handshake_timeout_dur(config::timeout_open_handshake)
313  , m_close_handshake_timeout_dur(config::timeout_close_handshake)
314  , m_pong_timeout_dur(config::timeout_pong)
315  , m_max_message_size(config::max_message_size)
316  , m_state(session::state::connecting)
317  , m_internal_state(session::internal_state::USER_INIT)
318  , m_msg_manager(new con_msg_manager_type())
319  , m_send_buffer_size(0)
320  , m_write_flag(false)
321  , m_read_flag(true)
322  , m_is_server(p_is_server)
323  , m_alog(alog)
324  , m_elog(elog)
325  , m_rng(rng)
326  , m_local_close_code(close::status::abnormal_close)
327  , m_remote_close_code(close::status::abnormal_close)
328  , m_is_http(false)
329  , m_http_state(session::http_state::init)
330  , m_was_clean(false)
331  {
332  m_alog.write(log::alevel::devel,"connection constructor");
333  }
334 
336  ptr get_shared() {
337  return lib::static_pointer_cast<type>(transport_con_type::get_shared());
338  }
339 
341  // Set Handler Callbacks //
343 
345 
351  void set_open_handler(open_handler h) {
352  m_open_handler = h;
353  }
354 
356 
361  void set_close_handler(close_handler h) {
362  m_close_handler = h;
363  }
364 
366 
372  void set_fail_handler(fail_handler h) {
373  m_fail_handler = h;
374  }
375 
377 
387  void set_ping_handler(ping_handler h) {
388  m_ping_handler = h;
389  }
390 
392 
398  void set_pong_handler(pong_handler h) {
399  m_pong_handler = h;
400  }
401 
403 
421  void set_pong_timeout_handler(pong_timeout_handler h) {
422  m_pong_timeout_handler = h;
423  }
424 
426 
432  void set_interrupt_handler(interrupt_handler h) {
433  m_interrupt_handler = h;
434  }
435 
437 
447  void set_http_handler(http_handler h) {
448  m_http_handler = h;
449  }
450 
452 
463  void set_validate_handler(validate_handler h) {
464  m_validate_handler = h;
465  }
466 
468 
473  void set_message_handler(message_handler h) {
474  m_message_handler = h;
475  }
476 
478  // Connection timeouts and other limits //
480 
482 
501  void set_open_handshake_timeout(long dur) {
502  m_open_handshake_timeout_dur = dur;
503  }
504 
506 
526  m_close_handshake_timeout_dur = dur;
527  }
528 
530 
546  void set_pong_timeout(long dur) {
547  m_pong_timeout_dur = dur;
548  }
549 
551 
559  size_t get_max_message_size() const {
560  return m_max_message_size;
561  }
562 
564 
575  void set_max_message_size(size_t new_value) {
576  m_max_message_size = new_value;
577  if (m_processor) {
578  m_processor->set_max_message_size(new_value);
579  }
580  }
581 
583 
594  size_t get_max_http_body_size() const {
595  return m_request.get_max_body_size();
596  }
597 
599 
610  void set_max_http_body_size(size_t new_value) {
611  m_request.set_max_body_size(new_value);
612  }
613 
615  // Uncategorized public methods //
617 
619 
629  size_t get_buffered_amount() const;
630 
632  size_t buffered_amount() const {
633  return get_buffered_amount();
634  }
635 
637  // Action Methods //
639 
641 
652  lib::error_code send(std::string const & payload, frame::opcode::value op =
653  frame::opcode::text);
654 
656 
669  lib::error_code send(void const * payload, size_t len, frame::opcode::value
670  op = frame::opcode::binary);
671 
673 
685  lib::error_code send(message_ptr msg);
686 
688 
700  lib::error_code interrupt();
701 
703  void handle_interrupt();
704 
706 
725  lib::error_code pause_reading();
726 
728  void handle_pause_reading();
729 
731 
737  lib::error_code resume_reading();
738 
740  void handle_resume_reading();
741 
743 
754  void ping(std::string const & payload);
755 
757  void ping(std::string const & payload, lib::error_code & ec);
758 
760  void handle_pong_timeout(std::string payload, lib::error_code const & ec);
761 
763 
772  void pong(std::string const & payload);
773 
775  void pong(std::string const & payload, lib::error_code & ec);
776 
778 
797  void close(close::status::value const code, std::string const & reason);
798 
800  void close(close::status::value const code, std::string const & reason,
801  lib::error_code & ec);
802 
804  // Pass-through access to the uri information //
806 
808 
814  bool get_secure() const;
815 
817 
823  std::string const & get_host() const;
824 
826 
832  std::string const & get_resource() const;
833 
835 
841  uint16_t get_port() const;
842 
844 
850  uri_ptr get_uri() const;
851 
853 
859  void set_uri(uri_ptr uri);
860 
862  // Subprotocol negotiation //
864 
866 
872  std::string const & get_subprotocol() const;
873 
875 
881  std::vector<std::string> const & get_requested_subprotocols() const;
882 
884 
896  void add_subprotocol(std::string const & request, lib::error_code & ec);
897 
899 
909  void add_subprotocol(std::string const & request);
910 
912 
924  void select_subprotocol(std::string const & value, lib::error_code & ec);
925 
927 
937  void select_subprotocol(std::string const & value);
938 
940  // Pass-through access to the request and response objects //
942 
944 
950  std::string const & get_request_header(std::string const & key) const;
951 
953 
961  std::string const & get_request_body() const;
962 
964 
970  std::string const & get_response_header(std::string const & key) const;
971 
973 
986  void set_status(http::status_code::value code);
987 
989 
1001  void set_status(http::status_code::value code, std::string const & msg);
1002 
1004 
1016  void set_body(std::string const & value);
1017 
1019 
1032  void append_header(std::string const & key, std::string const & val);
1033 
1035 
1047  void replace_header(std::string const & key, std::string const & val);
1048 
1050 
1059  void remove_header(std::string const & key);
1060 
1062 
1075  request_type const & get_request() const {
1076  return m_request;
1077  }
1078 
1080 
1092  lib::error_code defer_http_response();
1093 
1095 
1104  void send_http_response(lib::error_code & ec);
1105 
1107  void send_http_response();
1108 
1109  // TODO HTTPNBIO: write_headers
1110  // function that processes headers + status so far and writes it to the wire
1111  // beginning the HTTP response body state. This method will ignore anything
1112  // in the response body.
1113 
1114  // TODO HTTPNBIO: write_body_message
1115  // queues the specified message_buffer for async writing
1116 
1117  // TODO HTTPNBIO: finish connection
1118  //
1119 
1120  // TODO HTTPNBIO: write_response
1121  // Writes the whole response, headers + body and closes the connection
1122 
1123 
1124 
1126  // Pass-through access to the other connection information //
1128 
1130 
1138  return m_connection_hdl;
1139  }
1140 
1142 
1145  bool is_server() const {
1146  return m_is_server;
1147  }
1148 
1150 
1156  std::string const & get_origin() const;
1157 
1159 
1164  session::state::value get_state() const;
1165 
1166 
1168 
1172  return m_local_close_code;
1173  }
1174 
1176 
1179  std::string const & get_local_close_reason() const {
1180  return m_local_close_reason;
1181  }
1182 
1184 
1188  return m_remote_close_code;
1189  }
1190 
1192 
1195  std::string const & get_remote_close_reason() const {
1196  return m_remote_close_reason;
1197  }
1198 
1200 
1208  lib::error_code get_ec() const {
1209  return m_ec;
1210  }
1211 
1213  // The remaining public member functions are for internal/policy use //
1214  // only. Do not call from application code unless you understand what //
1215  // you are doing. //
1217 
1219 
1228  m_connection_hdl = hdl;
1229  transport_con_type::set_handle(hdl);
1230  }
1231 
1233 
1251  message_ptr get_message(websocketpp::frame::opcode::value op, size_t size)
1252  const
1253  {
1254  return m_msg_manager->get_message(op, size);
1255  }
1256 
1257  void start();
1258 
1259  void read_handshake(size_t num_bytes);
1260 
1261  void handle_read_handshake(lib::error_code const & ec,
1262  size_t bytes_transferred);
1263  void handle_read_http_response(lib::error_code const & ec,
1264  size_t bytes_transferred);
1265 
1266 
1267  void handle_write_http_response(lib::error_code const & ec);
1268  void handle_send_http_request(lib::error_code const & ec);
1269 
1270  void handle_open_handshake_timeout(lib::error_code const & ec);
1271  void handle_close_handshake_timeout(lib::error_code const & ec);
1272 
1273  void handle_read_frame(lib::error_code const & ec, size_t bytes_transferred);
1274  void read_frame();
1275 
1277  std::vector<int> const & get_supported_versions() const;
1278 
1281  void set_termination_handler(termination_handler new_handler);
1282 
1283  void terminate(lib::error_code const & ec);
1284  void handle_terminate(terminate_status tstat, lib::error_code const & ec);
1285 
1287 
1292  void write_frame();
1293 
1295 
1306  void handle_write_frame(lib::error_code const & ec);
1307 protected:
1308  void handle_transport_init(lib::error_code const & ec);
1309 
1312  lib::error_code initialize_processor();
1313 
1316  lib::error_code process_handshake_request();
1317 private:
1319  void write_http_response(lib::error_code const & ec);
1320 
1322  void send_http_request();
1323 
1325  void write_http_response_error(lib::error_code const & ec);
1326 
1328 
1331  void process_control_frame(message_ptr msg);
1332 
1334 
1344  lib::error_code send_close_ack(close::status::value code =
1345  close::status::blank, std::string const & reason = "");
1346 
1348 
1362  lib::error_code send_close_frame(close::status::value code =
1363  close::status::blank, std::string const & reason = "", bool ack = false,
1364  bool terminal = false);
1365 
1367 
1376  processor_ptr get_processor(int version) const;
1377 
1379 
1388  void write_push(message_ptr msg);
1389 
1391 
1401  message_ptr write_pop();
1402 
1404 
1409  void log_open_result();
1410 
1412 
1415  void log_close_result();
1416 
1418 
1421  void log_fail_result();
1422 
1424 
1427  void log_http_result();
1428 
1430  template <typename error_type>
1431  void log_err(log::level l, char const * msg, error_type const & ec) {
1432  std::stringstream s;
1433  s << msg << " error: " << ec << " (" << ec.message() << ")";
1434  m_elog.write(l, s.str());
1435  }
1436 
1437  // internal handler functions
1438  read_handler m_handle_read_frame;
1439  write_frame_handler m_write_frame_handler;
1440 
1441  // static settings
1442  std::string const m_user_agent;
1443 
1445  connection_hdl m_connection_hdl;
1446 
1448  open_handler m_open_handler;
1449  close_handler m_close_handler;
1450  fail_handler m_fail_handler;
1451  ping_handler m_ping_handler;
1452  pong_handler m_pong_handler;
1453  pong_timeout_handler m_pong_timeout_handler;
1454  interrupt_handler m_interrupt_handler;
1455  http_handler m_http_handler;
1456  validate_handler m_validate_handler;
1457  message_handler m_message_handler;
1458 
1460  long m_open_handshake_timeout_dur;
1461  long m_close_handshake_timeout_dur;
1462  long m_pong_timeout_dur;
1463  size_t m_max_message_size;
1464 
1466 
1469  session::state::value m_state;
1470 
1472 
1475  istate_type m_internal_state;
1476 
1477  mutable mutex_type m_connection_state_lock;
1478 
1480 
1484  mutex_type m_write_lock;
1485 
1486  // connection resources
1487  char m_buf[config::connection_read_buffer_size];
1488  size_t m_buf_cursor;
1489  termination_handler m_termination_handler;
1490  con_msg_manager_ptr m_msg_manager;
1491  timer_ptr m_handshake_timer;
1492  timer_ptr m_ping_timer;
1493 
1496  std::string m_handshake_buffer;
1497 
1499 
1507  processor_ptr m_processor;
1508 
1510 
1513  std::queue<message_ptr> m_send_queue;
1514 
1516 
1519  size_t m_send_buffer_size;
1520 
1522 
1525  std::vector<transport::buffer> m_send_buffer;
1526 
1529  std::vector<message_ptr> m_current_msgs;
1530 
1532 
1535  bool m_write_flag;
1536 
1538  bool m_read_flag;
1539 
1540  // connection data
1541  request_type m_request;
1542  response_type m_response;
1543  uri_ptr m_uri;
1544  std::string m_subprotocol;
1545 
1546  // connection data that might not be necessary to keep around for the life
1547  // of the whole connection.
1548  std::vector<std::string> m_requested_subprotocols;
1549 
1550  bool const m_is_server;
1551  alog_type& m_alog;
1552  elog_type& m_elog;
1553 
1554  rng_type & m_rng;
1555 
1556  // Close state
1558  close::status::value m_local_close_code;
1559 
1561  std::string m_local_close_reason;
1562 
1564  close::status::value m_remote_close_code;
1565 
1567  std::string m_remote_close_reason;
1568 
1570  lib::error_code m_ec;
1571 
1574  bool m_is_http;
1575 
1578  session::http_state::value m_http_state;
1579 
1580  bool m_was_clean;
1581 
1583  bool m_closed_by_me;
1584 
1586  bool m_failed_by_me;
1587 
1589  bool m_dropped_by_me;
1590 };
1591 
1592 } // namespace websocketpp
1593 
1594 #include <websocketpp/impl/connection_impl.hpp>
1595 
1596 #endif // WEBSOCKETPP_CONNECTION_HPP
lib::error_code process_handshake_request()
std::string const & get_remote_close_reason() const
Get the WebSocket close reason sent by the remote endpoint.
void add_subprotocol(std::string const &request, lib::error_code &ec)
Adds the given subprotocol string to the request list (exception free)
void set_open_handshake_timeout(long dur)
Set open handshake timeout.
Definition: connection.hpp:501
void set_termination_handler(termination_handler new_handler)
connection_hdl get_handle() const
Get Connection Handle.
void set_pong_timeout(long dur)
Set pong timeout.
Definition: connection.hpp:546
ptr get_shared()
Get a shared pointer to this component.
Definition: connection.hpp:336
void read_frame()
Issue a new transport read unless reading is paused.
std::vector< std::string > const & get_requested_subprotocols() const
Gets all of the subprotocols requested by the client.
uint16_t value
The type of a close code value.
Definition: close.hpp:49
message_ptr get_message(websocketpp::frame::opcode::value op, size_t size) const
Get a message buffer.
std::string const & get_subprotocol() const
Gets the negotated subprotocol.
bool terminal(value code)
Determine if the code represents an unrecoverable error.
Definition: close.hpp:212
lib::function< void(connection_hdl)> close_handler
The type and function signature of a close handler.
Definition: connection.hpp:69
lib::error_code pause_reading()
Pause reading of new data.
lib::function< void(connection_hdl)> open_handler
The type and function signature of an open handler.
Definition: connection.hpp:59
close::status::value get_local_close_code() const
Get the WebSocket close code sent by this endpoint.
lib::function< void(connection_hdl, std::string)> pong_timeout_handler
The type and function signature of a pong timeout handler.
Definition: connection.hpp:116
std::string const & get_local_close_reason() const
Get the WebSocket close reason sent by this endpoint.
session::state::value get_state() const
Return the connection state.
static std::vector< int > const versions_supported(helper, helper+4)
Container that stores the list of protocol versions supported.
lib::function< void(connection_hdl)> interrupt_handler
The type and function signature of an interrupt handler.
Definition: connection.hpp:91
transport_con_type::ptr transport_con_ptr
Type of a shared pointer to the transport component of this connection.
Definition: connection.hpp:258
void set_open_handler(open_handler h)
Set open handler.
Definition: connection.hpp:351
WebSocket protocol processor abstract base class.
Definition: processor.hpp:160
lib::function< bool(connection_hdl, std::string)> ping_handler
The type and function signature of a ping handler.
Definition: connection.hpp:101
uri_ptr get_uri() const
Gets the connection URI.
void replace_header(std::string const &key, std::string const &val)
Replace a header.
void ping(std::string const &payload)
Send a ping.
lib::weak_ptr< type > weak_ptr
Type of a weak pointer to this connection.
Definition: connection.hpp:245
Represents an individual WebSocket connection.
Definition: connection.hpp:235
void set_fail_handler(fail_handler h)
Set fail handler.
Definition: connection.hpp:372
size_t get_buffered_amount() const
Get the size of the outgoing write buffer (in payload bytes)
lib::weak_ptr< void > connection_hdl
A handle to uniquely identify a connection.
void set_http_handler(http_handler h)
Set http handler.
Definition: connection.hpp:447
void select_subprotocol(std::string const &value, lib::error_code &ec)
Select a subprotocol to use (exception free)
void set_close_handler(close_handler h)
Set close handler.
Definition: connection.hpp:361
lib::error_code get_ec() const
Get the internal error code for a closed/failed connection.
void pong(std::string const &payload)
Send a pong.
void send_http_response()
Send deferred HTTP Response.
void handle_resume_reading()
Resume reading callback.
config::alog_type alog_type
Type of the access logging policy.
Definition: connection.hpp:250
lib::error_code initialize_processor()
static level const devel
Development messages (warning: very chatty)
Definition: levels.hpp:141
std::string const & get_request_header(std::string const &key) const
Retrieve a request header.
lib::function< bool(connection_hdl)> validate_handler
The type and function signature of a validate handler.
Definition: connection.hpp:129
close::status::value get_remote_close_code() const
Get the WebSocket close code sent by the remote endpoint.
void set_pong_handler(pong_handler h)
Set pong handler.
Definition: connection.hpp:398
connection< config > type
Type of this connection.
Definition: connection.hpp:241
void set_close_handshake_timeout(long dur)
Set close handshake timeout.
Definition: connection.hpp:525
lib::error_code resume_reading()
Resume reading of new data.
bool is_server() const
Get whether or not this connection is part of a server or client.
void close(close::status::value const code, std::string const &reason)
Close the connection.
void set_handle(connection_hdl hdl)
Set Connection Handle.
lib::error_code defer_http_response()
Defer HTTP Response until later (Exception free)
void set_status(http::status_code::value code)
Set response status code and message.
void handle_pong_timeout(std::string payload, lib::error_code const &ec)
Utility method that gets called back when the ping timer expires.
config::concurrency_type concurrency_type
Type of the concurrency component of this connection.
Definition: connection.hpp:248
config::rng_type rng_type
Type of RNG.
Definition: connection.hpp:275
void append_header(std::string const &key, std::string const &val)
Append a header.
lib::error_code send(std::string const &payload, frame::opcode::value op=frame::opcode::text)
Create a message and then add it to the outgoing send queue.
config::transport_type::transport_con_type transport_con_type
Type of the transport component of this connection.
Definition: connection.hpp:256
lib::function< void(connection_hdl)> http_handler
The type and function signature of a http handler.
Definition: connection.hpp:151
void set_ping_handler(ping_handler h)
Set ping handler.
Definition: connection.hpp:387
void write_frame()
Checks if there are frames in the send queue and if there are sends one.
void handle_write_frame(lib::error_code const &ec)
Process the results of a frame write operation and start the next write.
void set_max_http_body_size(size_t new_value)
Set maximum HTTP message body size.
Definition: connection.hpp:610
Namespace for the WebSocket++ project.
Definition: base64.hpp:41
void set_max_message_size(size_t new_value)
Set maximum message size.
Definition: connection.hpp:575
std::string const & get_origin() const
Return the same origin policy origin value from the opening request.
void set_pong_timeout_handler(pong_timeout_handler h)
Set pong timeout handler.
Definition: connection.hpp:421
std::string const & get_response_header(std::string const &key) const
Retrieve a response header.
uint16_t get_port() const
Returns the port component of the connection URI.
std::string const & get_resource() const
Returns the resource component of the connection URI.
void set_interrupt_handler(interrupt_handler h)
Set interrupt handler.
Definition: connection.hpp:432
request_type const & get_request() const
Get request object.
std::vector< int > const & get_supported_versions() const
Get array of WebSocket protocol versions that this connection supports.
static int const helper[]
Helper array to get around lack of initializer lists pre C++11.
Definition: connection.hpp:167
lib::shared_ptr< uri > uri_ptr
Pointer to a URI.
Definition: uri.hpp:350
void handle_interrupt()
Transport inturrupt callback.
void handle_pause_reading()
Pause reading callback.
void set_validate_handler(validate_handler h)
Set validate handler.
Definition: connection.hpp:463
lib::shared_ptr< type > ptr
Type of a shared pointer to this connection.
Definition: connection.hpp:243
size_t get_max_message_size() const
Get maximum message size.
Definition: connection.hpp:559
void set_message_handler(message_handler h)
Set message handler.
Definition: connection.hpp:473
bool get_secure() const
Returns the secure flag from the connection URI.
static value const abnormal_close
A dummy value to indicate that the connection was closed abnormally.
Definition: close.hpp:104
size_t buffered_amount() const
DEPRECATED: use get_buffered_amount instead.
Definition: connection.hpp:632
lib::function< void(connection_hdl, std::string)> pong_handler
The type and function signature of a pong handler.
Definition: connection.hpp:109
std::string const & get_request_body() const
Retrieve a request body.
void set_uri(uri_ptr uri)
Sets the connection URI.
std::string const & get_host() const
Returns the host component of the connection URI.
size_t get_max_http_body_size() const
Get maximum HTTP message body size.
Definition: connection.hpp:594
lib::error_code interrupt()
Asyncronously invoke handler::on_inturrupt.
transport_con_type::timer_ptr timer_ptr
Type of a pointer to a transport timer handle.
Definition: connection.hpp:284
lib::function< void(connection_hdl)> fail_handler
The type and function signature of a fail handler.
Definition: connection.hpp:79
config::elog_type elog_type
Type of the error logging policy.
Definition: connection.hpp:252
static value const blank
A blank value for internal use.
Definition: close.hpp:52
void remove_header(std::string const &key)
Remove a header.
void set_body(std::string const &value)
Set response body content.