Wire Sysio Wire Sysion 1.0.0
Loading...
Searching...
No Matches
websocketpp::processor::hybi13< config > Class Template Reference

Processor for Hybi version 13 (RFC6455) More...

#include <hybi13.hpp>

Inheritance diagram for websocketpp::processor::hybi13< config >:
Collaboration diagram for websocketpp::processor::hybi13< config >:

Classes

struct  msg_metadata
 

Public Types

typedef processor< configbase
 
typedef config::request_type request_type
 
typedef config::response_type response_type
 
typedef config::message_type message_type
 
typedef message_type::ptr message_ptr
 
typedef config::con_msg_manager_type msg_manager_type
 
typedef msg_manager_type::ptr msg_manager_ptr
 
typedef config::rng_type rng_type
 
typedef config::permessage_deflate_type permessage_deflate_type
 
typedef std::pair< lib::error_code, std::string > err_str_pair
 
- Public Types inherited from websocketpp::processor::processor< config >
typedef processor< configtype
 
typedef config::request_type request_type
 
typedef config::response_type response_type
 
typedef config::message_type::ptr message_ptr
 
typedef std::pair< lib::error_code, std::string > err_str_pair
 

Public Member Functions

 hybi13 (bool secure, bool p_is_server, msg_manager_ptr manager, rng_type &rng)
 
int get_version () const
 Get the protocol version of this processor.
 
bool has_permessage_deflate () const
 
err_str_pair negotiate_extensions (request_type const &request)
 Initializes extensions based on the Sec-WebSocket-Extensions header.
 
err_str_pair negotiate_extensions (response_type const &response)
 Initializes extensions based on the Sec-WebSocket-Extensions header.
 
template<typename header_type >
err_str_pair negotiate_extensions_helper (header_type const &header)
 Extension negotiation helper function.
 
lib::error_code validate_handshake (request_type const &r) const
 validate a WebSocket handshake request for this version
 
lib::error_code process_handshake (request_type const &request, std::string const &subprotocol, response_type &response) const
 Calculate the appropriate response for this websocket request.
 
lib::error_code client_handshake_request (request_type &req, uri_ptr uri, std::vector< std::string > const &subprotocols) const
 Fill in a set of request headers for a client connection request.
 
lib::error_code validate_server_handshake_response (request_type const &req, response_type &res) const
 Validate the server's response to an outgoing handshake request.
 
std::string get_raw (response_type const &res) const
 Given a completed response, get the raw bytes to put on the wire.
 
std::string const & get_origin (request_type const &r) const
 Return the value of the header containing the CORS origin.
 
lib::error_code extract_subprotocols (request_type const &req, std::vector< std::string > &subprotocol_list)
 Extracts requested subprotocols from a handshake request.
 
uri_ptr get_uri (request_type const &request) const
 Extracts client uri from a handshake request.
 
size_t consume (uint8_t *buf, size_t len, lib::error_code &ec)
 Process new websocket connection bytes.
 
lib::error_code finalize_message ()
 Perform any finalization actions on an incoming message.
 
void reset_headers ()
 
bool ready () const
 Test whether or not the processor has a message ready.
 
message_ptr get_message ()
 Retrieves the most recently processed message.
 
bool get_error () const
 Test whether or not the processor is in a fatal error state.
 
size_t get_bytes_needed () const
 
virtual lib::error_code prepare_data_frame (message_ptr in, message_ptr out)
 Prepare a user data message for writing.
 
lib::error_code prepare_ping (std::string const &in, message_ptr out) const
 Get URI.
 
lib::error_code prepare_pong (std::string const &in, message_ptr out) const
 
virtual lib::error_code prepare_close (close::status::value code, std::string const &reason, message_ptr out) const
 
- Public Member Functions inherited from websocketpp::processor::processor< config >
 processor (bool secure, bool p_is_server)
 
virtual ~processor ()
 
size_t get_max_message_size () const
 Get maximum message size.
 
void set_max_message_size (size_t new_value)
 Set maximum message size.
 
virtual bool has_permessage_compress () const
 Returns whether or not the permessage_compress extension is implemented.
 
virtual lib::error_code prepare_data_frame (message_ptr in, message_ptr out)=0
 Prepare a data message for writing.
 
virtual lib::error_code prepare_ping (std::string const &in, message_ptr out) const =0
 Prepare a ping frame.
 
virtual lib::error_code prepare_pong (std::string const &in, message_ptr out) const =0
 Prepare a pong frame.
 
virtual lib::error_code prepare_close (close::status::value code, std::string const &reason, message_ptr out) const =0
 Prepare a close frame.
 

Protected Types

enum  state {
  HEADER_BASIC = 0 , HEADER_EXTENDED = 1 , EXTENSION = 2 , APPLICATION = 3 ,
  READY = 4 , FATAL_ERROR = 5
}
 

Protected Member Functions

lib::error_code process_handshake_key (std::string &key) const
 Convert a client handshake key into a server response key in place.
 
size_t copy_basic_header_bytes (uint8_t const *buf, size_t len)
 Reads bytes from buf into m_basic_header.
 
size_t copy_extended_header_bytes (uint8_t const *buf, size_t len)
 Reads bytes from buf into m_extended_header.
 
size_t process_payload_bytes (uint8_t *buf, size_t len, lib::error_code &ec)
 Reads bytes from buf into message payload.
 
lib::error_code validate_incoming_basic_header (frame::basic_header const &h, bool is_server, bool new_msg) const
 Validate an incoming basic header.
 
lib::error_code validate_incoming_extended_header (frame::basic_header h, frame::extended_header e) const
 Validate an incoming extended header.
 
void masked_copy (std::string const &i, std::string &o, frame::masking_key_type key) const
 Copy and mask/unmask in one operation.
 
lib::error_code prepare_control (frame::opcode::value op, std::string const &payload, message_ptr out) const
 Generic prepare control frame with opcode and payload.
 

Protected Attributes

frame::basic_header m_basic_header
 
msg_manager_ptr m_msg_manager
 
size_t m_bytes_needed
 
size_t m_cursor
 
msg_metadata m_data_msg
 
msg_metadata m_control_msg
 
msg_metadatam_current_msg
 
frame::extended_header m_extended_header
 
rng_typem_rng
 
state m_state
 
permessage_deflate_type m_permessage_deflate
 
- Protected Attributes inherited from websocketpp::processor::processor< config >
bool const m_secure
 
bool const m_server
 
size_t m_max_message_size
 

Detailed Description

template<typename config>
class websocketpp::processor::hybi13< config >

Definition at line 54 of file hybi13.hpp.

Member Typedef Documentation

◆ base

Definition at line 56 of file hybi13.hpp.

◆ err_str_pair

template<typename config >
std::pair<lib::error_code,std::string> websocketpp::processor::hybi13< config >::err_str_pair

Definition at line 70 of file hybi13.hpp.

◆ message_ptr

template<typename config >
message_type::ptr websocketpp::processor::hybi13< config >::message_ptr

Definition at line 62 of file hybi13.hpp.

◆ message_type

template<typename config >
config::message_type websocketpp::processor::hybi13< config >::message_type

Definition at line 61 of file hybi13.hpp.

◆ msg_manager_ptr

template<typename config >
msg_manager_type::ptr websocketpp::processor::hybi13< config >::msg_manager_ptr

Definition at line 65 of file hybi13.hpp.

◆ msg_manager_type

template<typename config >
config::con_msg_manager_type websocketpp::processor::hybi13< config >::msg_manager_type

Definition at line 64 of file hybi13.hpp.

◆ permessage_deflate_type

template<typename config >
config::permessage_deflate_type websocketpp::processor::hybi13< config >::permessage_deflate_type

Definition at line 68 of file hybi13.hpp.

◆ request_type

template<typename config >
config::request_type websocketpp::processor::hybi13< config >::request_type

Definition at line 58 of file hybi13.hpp.

◆ response_type

template<typename config >
config::response_type websocketpp::processor::hybi13< config >::response_type

Definition at line 59 of file hybi13.hpp.

◆ rng_type

template<typename config >
config::rng_type websocketpp::processor::hybi13< config >::rng_type

Definition at line 66 of file hybi13.hpp.

Member Enumeration Documentation

◆ state

template<typename config >
enum websocketpp::processor::hybi13::state
protected
Enumerator
HEADER_BASIC 
HEADER_EXTENDED 
EXTENSION 
APPLICATION 
READY 
FATAL_ERROR 

Definition at line 997 of file hybi13.hpp.

Constructor & Destructor Documentation

◆ hybi13()

template<typename config >
websocketpp::processor::hybi13< config >::hybi13 ( bool secure,
bool p_is_server,
msg_manager_ptr manager,
rng_type & rng )
inlineexplicit

Definition at line 72 of file hybi13.hpp.

73 : processor<config>(secure, p_is_server)
74 , m_msg_manager(manager)
75 , m_rng(rng)
76 {
78 }
msg_manager_ptr m_msg_manager
Definition hybi13.hpp:1025
Here is the call graph for this function:

Member Function Documentation

◆ client_handshake_request()

template<typename config >
lib::error_code websocketpp::processor::hybi13< config >::client_handshake_request ( request_type & req,
uri_ptr uri,
std::vector< std::string > const & subprotocols ) const
inlinevirtual
Parameters
[out]reqSet of headers to fill in
[in]uriThe uri being connected to
[in]subprotocolsThe list of subprotocols to request

Implements websocketpp::processor::processor< config >.

Definition at line 215 of file hybi13.hpp.

217 {
218 req.set_method("GET");
219 req.set_uri(uri->get_resource());
220 req.set_version("HTTP/1.1");
221
222 req.append_header("Upgrade","websocket");
223 req.append_header("Connection","Upgrade");
224 req.replace_header("Sec-WebSocket-Version","13");
225 req.replace_header("Host",uri->get_host_port());
226
227 if (!subprotocols.empty()) {
228 std::ostringstream result;
229 std::vector<std::string>::const_iterator it = subprotocols.begin();
230 result << *it++;
231 while (it != subprotocols.end()) {
232 result << ", " << *it++;
233 }
234
235 req.replace_header("Sec-WebSocket-Protocol",result.str());
236 }
237
238 // Generate handshake key
239 frame::uint32_converter conv;
240 unsigned char raw_key[16];
241
242 for (int i = 0; i < 4; i++) {
243 conv.i = m_rng();
244 std::copy(conv.c,conv.c+4,&raw_key[i*4]);
245 }
246
247 req.replace_header("Sec-WebSocket-Key",base64_encode(raw_key, 16));
248
249 if (m_permessage_deflate.is_implemented()) {
250 std::string offer = m_permessage_deflate.generate_offer();
251 if (!offer.empty()) {
252 req.replace_header("Sec-WebSocket-Extensions",offer);
253 }
254 }
255
256 return lib::error_code();
257 }
permessage_deflate_type m_permessage_deflate
Definition hybi13.hpp:1050
std::string base64_encode(unsigned char const *input, size_t len)
Encode a char buffer into a base64 string.
Definition base64.hpp:66
Here is the call graph for this function:

◆ consume()

template<typename config >
size_t websocketpp::processor::hybi13< config >::consume ( uint8_t * buf,
size_t len,
lib::error_code & ec )
inlinevirtual

Hybi 13 data streams represent a series of variable length frames. Each frame is made up of a series of fixed length fields. The lengths of later fields are contained in earlier fields. The first field length is fixed by the spec.

This processor represents a state machine that keeps track of what field is presently being read and how many more bytes are needed to complete it

Read two header bytes Extract full frame length. Read extra header bytes Validate frame header (including extension validate) Read extension data into extension message state object Read payload data into payload

Parameters
bufInput buffer
lenLength of input buffer
Returns
Number of bytes processed or zero on error

Implements websocketpp::processor::processor< config >.

Definition at line 360 of file hybi13.hpp.

360 {
361 size_t p = 0;
362
363 ec = lib::error_code();
364
365 //std::cout << "consume: " << utility::to_hex(buf,len) << std::endl;
366
367 // Loop while we don't have a message ready and we still have bytes
368 // left to process.
369 while (m_state != READY && m_state != FATAL_ERROR &&
370 (p < len || m_bytes_needed == 0))
371 {
372 if (m_state == HEADER_BASIC) {
373 p += this->copy_basic_header_bytes(buf+p,len-p);
374
375 if (m_bytes_needed > 0) {
376 continue;
377 }
378
381 );
382 if (ec) {break;}
383
384 // extract full header size and adjust consume state accordingly
386 m_cursor = 0;
388 frame::BASIC_HEADER_LENGTH;
389 } else if (m_state == HEADER_EXTENDED) {
391
392 if (m_bytes_needed > 0) {
393 continue;
394 }
395
397 if (ec){break;}
398
401
402 // check if this frame is the start of a new message and set up
403 // the appropriate message metadata.
405
406 // TODO: get_message failure conditions
407
409 m_control_msg = msg_metadata(
410 m_msg_manager->get_message(op,m_bytes_needed),
412 );
413
415 } else {
416 if (!m_data_msg.msg_ptr) {
418 ec = make_error_code(error::message_too_big);
419 break;
420 }
421
422 m_data_msg = msg_metadata(
423 m_msg_manager->get_message(op,m_bytes_needed),
425 );
426
427 if (m_permessage_deflate.is_enabled()) {
429 }
430 } else {
431 // Fetch the underlying payload buffer from the data message we
432 // are writing into.
433 std::string & out = m_data_msg.msg_ptr->get_raw_payload();
434
435 if (out.size() + m_bytes_needed > base::m_max_message_size) {
436 ec = make_error_code(error::message_too_big);
437 break;
438 }
439
440 // Each frame starts a new masking key. All other state
441 // remains between frames.
446 )
447 );
448
449 out.reserve(out.size() + m_bytes_needed);
450 }
452 }
453 } else if (m_state == EXTENSION) {
455 } else if (m_state == APPLICATION) {
456 size_t bytes_to_process = (std::min)(m_bytes_needed,len-p);
457
458 if (bytes_to_process > 0) {
459 p += this->process_payload_bytes(buf+p,bytes_to_process,ec);
460
461 if (ec) {break;}
462 }
463
464 if (m_bytes_needed > 0) {
465 continue;
466 }
467
468 // If this was the last frame in the message set the ready flag.
469 // Otherwise, reset processor state to read additional frames.
471 ec = finalize_message();
472 if (ec) {
473 break;
474 }
475 } else {
476 this->reset_headers();
477 }
478 } else {
479 // shouldn't be here
480 ec = make_error_code(error::general);
481 return 0;
482 }
483 }
484
485 return p;
486 }
const mie::Vuint & p
Definition bn.cpp:27
lib::error_code validate_incoming_basic_header(frame::basic_header const &h, bool is_server, bool new_msg) const
Validate an incoming basic header.
Definition hybi13.hpp:826
size_t copy_basic_header_bytes(uint8_t const *buf, size_t len)
Reads bytes from buf into m_basic_header.
Definition hybi13.hpp:722
size_t copy_extended_header_bytes(uint8_t const *buf, size_t len)
Reads bytes from buf into m_extended_header.
Definition hybi13.hpp:754
frame::extended_header m_extended_header
Definition hybi13.hpp:1042
lib::error_code finalize_message()
Perform any finalization actions on an incoming message.
Definition hybi13.hpp:496
frame::basic_header m_basic_header
Definition hybi13.hpp:1022
size_t process_payload_bytes(uint8_t *buf, size_t len, lib::error_code &ec)
Reads bytes from buf into message payload.
Definition hybi13.hpp:777
lib::error_code validate_incoming_extended_header(frame::basic_header h, frame::extended_header e) const
Validate an incoming extended header.
Definition hybi13.hpp:904
bool is_control(value v)
Check if an opcode is for a control frame.
Definition frame.hpp:139
opcode::value get_opcode(basic_header const &h)
Extract opcode from basic header.
Definition frame.hpp:393
uint64_t get_payload_size(basic_header const &, extended_header const &)
Extract the full payload size field from a WebSocket header.
Definition frame.hpp:573
bool get_fin(basic_header const &h)
Check whether the frame's FIN bit is set.
Definition frame.hpp:321
bool get_rsv1(basic_header const &h)
check whether the frame's RSV1 bit is set
Definition frame.hpp:339
size_t get_header_len(basic_header const &)
Calculates the full length of the header based on the first bytes.
Definition frame.hpp:445
masking_key_type get_masking_key(basic_header const &, extended_header const &)
Extract the masking key from a frame header.
Definition frame.hpp:516
size_t prepare_masking_key(masking_key_type const &key)
Extract a masking key into a value the size of a machine word.
Definition frame.hpp:595
@ message_too_big
Processor encountered a message that was too large.
Definition base.hpp:78
size_t len
uint8_t buf[2048]
Here is the call graph for this function:

◆ copy_basic_header_bytes()

template<typename config >
size_t websocketpp::processor::hybi13< config >::copy_basic_header_bytes ( uint8_t const * buf,
size_t len )
inlineprotected

Definition at line 722 of file hybi13.hpp.

722 {
723 if (len == 0 || m_bytes_needed == 0) {
724 return 0;
725 }
726
727 if (len > 1) {
728 // have at least two bytes
729 if (m_bytes_needed == 2) {
730 m_basic_header.b0 = buf[0];
731 m_basic_header.b1 = buf[1];
732 m_bytes_needed -= 2;
733 return 2;
734 } else {
735 m_basic_header.b1 = buf[0];
737 return 1;
738 }
739 } else {
740 // have exactly one byte
741 if (m_bytes_needed == 2) {
742 m_basic_header.b0 = buf[0];
744 return 1;
745 } else {
746 m_basic_header.b1 = buf[0];
748 return 1;
749 }
750 }
751 }
Here is the caller graph for this function:

◆ copy_extended_header_bytes()

template<typename config >
size_t websocketpp::processor::hybi13< config >::copy_extended_header_bytes ( uint8_t const * buf,
size_t len )
inlineprotected

Definition at line 754 of file hybi13.hpp.

754 {
755 size_t bytes_to_read = (std::min)(m_bytes_needed,len);
756
757 std::copy(buf,buf+bytes_to_read,m_extended_header.bytes+m_cursor);
758 m_cursor += bytes_to_read;
759 m_bytes_needed -= bytes_to_read;
760
761 return bytes_to_read;
762 }
uint8_t bytes[MAX_EXTENDED_HEADER_LENGTH]
Definition frame.hpp:258
Here is the caller graph for this function:

◆ extract_subprotocols()

template<typename config >
lib::error_code websocketpp::processor::hybi13< config >::extract_subprotocols ( request_type const & req,
std::vector< std::string > & subprotocol_list )
inlinevirtual

Extracts a list of all subprotocols that the client has requested in the given opening handshake request.

Parameters
[in]reqThe request to extract from
[out]subprotocol_listA reference to a vector of strings to store the results in.

Implements websocketpp::processor::processor< config >.

Definition at line 310 of file hybi13.hpp.

312 {
313 if (!req.get_header("Sec-WebSocket-Protocol").empty()) {
314 http::parameter_list p;
315
316 if (!req.get_header_as_plist("Sec-WebSocket-Protocol",p)) {
317 http::parameter_list::const_iterator it;
318
319 for (it = p.begin(); it != p.end(); ++it) {
320 subprotocol_list.push_back(it->first);
321 }
322 } else {
324 }
325 }
326 return lib::error_code();
327 }
@ subprotocol_parse_error
Error parsing subprotocols.
Definition base.hpp:147
lib::error_code make_error_code(error::processor_errors e)
Create an error code with the given value and the processor category.
Definition base.hpp:244
Here is the call graph for this function:

◆ finalize_message()

template<typename config >
lib::error_code websocketpp::processor::hybi13< config >::finalize_message ( )
inline

Called after the full message is received. Provides the opportunity for extensions to complete any data post processing as well as final UTF8 validation checks for text messages.

Returns
A code indicating errors, if any

Definition at line 496 of file hybi13.hpp.

496 {
497 std::string & out = m_current_msg->msg_ptr->get_raw_payload();
498
499 // if the frame is compressed, append the compression
500 // trailer and flush the compression buffer.
501 if (m_permessage_deflate.is_enabled()
502 && m_current_msg->msg_ptr->get_compressed())
503 {
504 uint8_t trailer[4] = {0x00, 0x00, 0xff, 0xff};
505
506 // Decompress current buffer into the message buffer
507 lib::error_code ec;
508 ec = m_permessage_deflate.decompress(trailer,4,out);
509 if (ec) {
510 return ec;
511 }
512 }
513
514 // ensure that text messages end on a valid UTF8 code point
517 return make_error_code(error::invalid_utf8);
518 }
519 }
520
521 m_state = READY;
522
523 return lib::error_code();
524 }
bool complete()
Return whether the input sequence ended on a valid utf8 codepoint.
@ invalid_utf8
Invalid UTF-8 encoding.
Definition base.hpp:114
unsigned char uint8_t
Definition stdint.h:124
Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_bytes_needed()

template<typename config >
size_t websocketpp::processor::hybi13< config >::get_bytes_needed ( ) const
inlinevirtual

Retrieves the number of bytes presently needed by the processor This value may be used as a hint to the transport layer as to how many bytes to wait for before running consume again.

Reimplemented from websocketpp::processor::processor< config >.

Definition at line 568 of file hybi13.hpp.

568 {
569 return m_bytes_needed;
570 }

◆ get_error()

template<typename config >
bool websocketpp::processor::hybi13< config >::get_error ( ) const
inlinevirtual

Implements websocketpp::processor::processor< config >.

Definition at line 564 of file hybi13.hpp.

564 {
565 return m_state == FATAL_ERROR;
566 }

◆ get_message()

template<typename config >
message_ptr websocketpp::processor::hybi13< config >::get_message ( )
inlinevirtual

Retrieves a shared pointer to the recently completed message if there is one. If ready() returns true then there is a message available. Retrieving the message with get_message will reset the state of ready. As such, each new message may be retrieved only once. Calling get_message when there is no message available will result in a null pointer being returned.

Returns
A pointer to the most recently processed message or a null shared pointer.

Implements websocketpp::processor::processor< config >.

Definition at line 545 of file hybi13.hpp.

545 {
546 if (!ready()) {
547 return message_ptr();
548 }
550 m_current_msg->msg_ptr.reset();
551
552 if (frame::opcode::is_control(ret->get_opcode())) {
553 m_control_msg.msg_ptr.reset();
554 } else {
555 m_data_msg.msg_ptr.reset();
556 }
557
558 this->reset_headers();
559
560 return ret;
561 }
message_type::ptr message_ptr
Definition hybi13.hpp:62
bool ready() const
Test whether or not the processor has a message ready.
Definition hybi13.hpp:541
websocketpp::config::asio_tls_client::message_type::ptr message_ptr
CK_RV ret
Here is the call graph for this function:

◆ get_origin()

template<typename config >
std::string const & websocketpp::processor::hybi13< config >::get_origin ( request_type const & request) const
inlinevirtual

Implements websocketpp::processor::processor< config >.

Definition at line 306 of file hybi13.hpp.

306 {
307 return r.get_header("Origin");
308 }
const mie::Vuint & r
Definition bn.cpp:28

◆ get_raw()

template<typename config >
std::string websocketpp::processor::hybi13< config >::get_raw ( response_type const & request) const
inlinevirtual

Implements websocketpp::processor::processor< config >.

Definition at line 302 of file hybi13.hpp.

302 {
303 return res.raw();
304 }

◆ get_uri()

template<typename config >
uri_ptr websocketpp::processor::hybi13< config >::get_uri ( request_type const & request) const
inlinevirtual

Implements websocketpp::processor::processor< config >.

Definition at line 329 of file hybi13.hpp.

329 {
330 return get_uri_from_host(request,(base::m_secure ? "wss" : "ws"));
331 }
uri_ptr get_uri_from_host(request_type &request, std::string scheme)
Extract a URI ptr from the host header of the request.
Here is the call graph for this function:

◆ get_version()

template<typename config >
int websocketpp::processor::hybi13< config >::get_version ( ) const
inlinevirtual

Implements websocketpp::processor::processor< config >.

Definition at line 80 of file hybi13.hpp.

80 {
81 return 13;
82 }

◆ has_permessage_deflate()

template<typename config >
bool websocketpp::processor::hybi13< config >::has_permessage_deflate ( ) const
inline

Definition at line 84 of file hybi13.hpp.

84 {
85 return m_permessage_deflate.is_implemented();
86 }

◆ masked_copy()

template<typename config >
void websocketpp::processor::hybi13< config >::masked_copy ( std::string const & i,
std::string & o,
frame::masking_key_type key ) const
inlineprotected

Reads input from one string and writes unmasked output to another.

Parameters
[in]iThe input string.
[out]oThe output string.
[in]keyThe masking key to use for masking/unmasking

Definition at line 939 of file hybi13.hpp.

941 {
942 frame::byte_mask(i.begin(),i.end(),o.begin(),key);
943 // TODO: SIMD masking
944 }
void byte_mask(input_iter b, input_iter e, output_iter o, masking_key_type const &key, size_t key_offset=0)
Byte by byte mask/unmask.
Definition frame.hpp:642
Here is the call graph for this function:
Here is the caller graph for this function:

◆ negotiate_extensions() [1/2]

template<typename config >
err_str_pair websocketpp::processor::hybi13< config >::negotiate_extensions ( request_type const & )
inlinevirtual

Reads the Sec-WebSocket-Extensions header and determines if any of the requested extensions are supported by this processor. If they are their settings data is initialized and an extension string to send to the is returned.

Parameters
requestThe request or response headers to look at.

Reimplemented from websocketpp::processor::processor< config >.

Definition at line 88 of file hybi13.hpp.

88 {
89 return negotiate_extensions_helper(request);
90 }
err_str_pair negotiate_extensions_helper(header_type const &header)
Extension negotiation helper function.
Definition hybi13.hpp:102
Here is the call graph for this function:
Here is the caller graph for this function:

◆ negotiate_extensions() [2/2]

template<typename config >
err_str_pair websocketpp::processor::hybi13< config >::negotiate_extensions ( response_type const & )
inlinevirtual

Reads the Sec-WebSocket-Extensions header and determines if any of the requested extensions were accepted by the server. If they are their settings data is initialized. If they are not a list of required extensions (if any) is returned. This list may be sent back to the server as a part of the 1010/Extension required close code.

Parameters
responseThe request or response headers to look at.

Reimplemented from websocketpp::processor::processor< config >.

Definition at line 92 of file hybi13.hpp.

92 {
93 return negotiate_extensions_helper(response);
94 }
Here is the call graph for this function:

◆ negotiate_extensions_helper()

template<typename config >
template<typename header_type >
err_str_pair websocketpp::processor::hybi13< config >::negotiate_extensions_helper ( header_type const & header)
inline

This exists mostly because the code for requests and responses is identical and I can't have virtual template methods.

Definition at line 102 of file hybi13.hpp.

102 {
104
105 // Respect blanket disabling of all extensions and don't even parse
106 // the extension header
107 if (!config::enable_extensions) {
108 ret.first = make_error_code(error::extensions_disabled);
109 return ret;
110 }
111
112 http::parameter_list p;
113
114 bool error = header.get_header_as_plist("Sec-WebSocket-Extensions",p);
115
116 if (error) {
117 ret.first = make_error_code(error::extension_parse_error);
118 return ret;
119 }
120
121 // If there are no extensions parsed then we are done!
122 if (p.size() == 0) {
123 return ret;
124 }
125
126 http::parameter_list::const_iterator it;
127
128 if (m_permessage_deflate.is_implemented()) {
129 err_str_pair neg_ret;
130 for (it = p.begin(); it != p.end(); ++it) {
131 // look through each extension, if the key is permessage-deflate
132 if (it->first == "permessage-deflate") {
133 // if we have already successfully negotiated this extension
134 // then skip any other requests to negotiate the same one
135 // with different parameters
136 if (m_permessage_deflate.is_enabled()) {
137 continue;
138 }
139
140
141 neg_ret = m_permessage_deflate.negotiate(it->second);
142
143 if (neg_ret.first) {
144 // Figure out if this is an error that should halt all
145 // extension negotiations or simply cause negotiation of
146 // this specific extension to fail.
147 //std::cout << "permessage-compress negotiation failed: "
148 // << neg_ret.first.message() << std::endl;
149 } else {
150 // Note: this list will need commas if WebSocket++ ever
151 // supports more than one extension
152 ret.second += neg_ret.second;
154 continue;
155 }
156 }
157 }
158 }
159
160 return ret;
161 }
std::pair< lib::error_code, std::string > err_str_pair
Definition hybi13.hpp:70
@ extensions_disabled
Extension related operation was ignored because extensions are disabled.
Definition base.hpp:153
@ extension_parse_error
Error parsing extensions.
Definition base.hpp:150
size_t size() const
Definition zm.h:519
Here is the call graph for this function:
Here is the caller graph for this function:

◆ prepare_close()

template<typename config >
virtual lib::error_code websocketpp::processor::hybi13< config >::prepare_close ( close::status::value code,
std::string const & reason,
message_ptr out ) const
inlinevirtual

Definition at line 674 of file hybi13.hpp.

676 {
677 if (close::status::reserved(code)) {
678 return make_error_code(error::reserved_close_code);
679 }
680
681 if (close::status::invalid(code) && code != close::status::no_status) {
682 return make_error_code(error::invalid_close_code);
683 }
684
685 if (code == close::status::no_status && reason.size() > 0) {
686 return make_error_code(error::reason_requires_code);
687 }
688
689 if (reason.size() > frame:: limits::payload_size_basic-2) {
690 return make_error_code(error::control_too_big);
691 }
692
693 std::string payload;
694
695 if (code != close::status::no_status) {
696 close::code_converter val;
697 val.i = htons(code);
698
699 payload.resize(reason.size()+2);
700
701 payload[0] = val.c[0];
702 payload[1] = val.c[1];
703
704 std::copy(reason.begin(),reason.end(),payload.begin()+2);
705 }
706
707 return this->prepare_control(frame::opcode::CLOSE,payload,out);
708 }
lib::error_code prepare_control(frame::opcode::value op, std::string const &payload, message_ptr out) const
Generic prepare control frame with opcode and payload.
Definition hybi13.hpp:955
bool invalid(value code)
Test whether a close code is invalid on the wire.
Definition close.hpp:194
bool reserved(value code)
Test whether a close code is in a reserved range.
Definition close.hpp:179
@ control_too_big
Control frame too large.
Definition base.hpp:90
@ reason_requires_code
Using a reason requires a close code.
Definition base.hpp:144
@ invalid_close_code
Invalid close code used.
Definition base.hpp:141
@ reserved_close_code
Reserved close code used.
Definition base.hpp:138
Here is the call graph for this function:

◆ prepare_control()

template<typename config >
lib::error_code websocketpp::processor::hybi13< config >::prepare_control ( frame::opcode::value op,
std::string const & payload,
message_ptr out ) const
inlineprotected

Internal control frame building method. Handles validation, masking, etc

Parameters
opThe control opcode to use
payloadThe payload to use
outThe message buffer to store the prepared frame in
Returns
Status code, zero on success, non-zero on error

Definition at line 955 of file hybi13.hpp.

957 {
958 if (!out) {
959 return make_error_code(error::invalid_arguments);
960 }
961
963 return make_error_code(error::invalid_opcode);
964 }
965
966 if (payload.size() > frame::limits::payload_size_basic) {
967 return make_error_code(error::control_too_big);
968 }
969
971 bool masked = !base::m_server;
972
973 frame::basic_header h(op,payload.size(),true,masked);
974
975 std::string & o = out->get_raw_payload();
976 o.resize(payload.size());
977
978 if (masked) {
979 // Generate masking key.
980 key.i = m_rng();
981
982 frame::extended_header e(payload.size(),key.i);
983 out->set_header(frame::prepare_header(h,e));
984 this->masked_copy(payload,o,key);
985 } else {
986 frame::extended_header e(payload.size());
987 out->set_header(frame::prepare_header(h,e));
988 std::copy(payload.begin(),payload.end(),o.begin());
989 }
990
991 out->set_opcode(op);
992 out->set_prepared(true);
993
994 return lib::error_code();
995 }
void masked_copy(std::string const &i, std::string &o, frame::masking_key_type key) const
Copy and mask/unmask in one operation.
Definition hybi13.hpp:939
uint32_converter masking_key_type
Definition frame.hpp:186
std::string prepare_header(const basic_header &h, const extended_header &e)
Generate a properly sized contiguous string that encodes a full frame header.
Definition frame.hpp:489
@ invalid_opcode
Opcode was invalid for requested operation.
Definition base.hpp:87
@ invalid_arguments
The processor method was called with invalid arguments.
Definition base.hpp:84
uint8_t key[16]
Definition yubico_otp.c:41
Here is the call graph for this function:
Here is the caller graph for this function:

◆ prepare_data_frame()

template<typename config >
virtual lib::error_code websocketpp::processor::hybi13< config >::prepare_data_frame ( message_ptr in,
message_ptr out )
inlinevirtual

Performs validation, masking, compression, etc. will return an error if there was an error, otherwise msg will be ready to be written

TODO: tests

Parameters
inAn unprepared message to prepare
outA message to be overwritten with the prepared message
Returns
error code

Definition at line 583 of file hybi13.hpp.

584 {
585 if (!in || !out) {
586 return make_error_code(error::invalid_arguments);
587 }
588
589 frame::opcode::value op = in->get_opcode();
590
591 // validate opcode: only regular data frames
593 return make_error_code(error::invalid_opcode);
594 }
595
596 std::string& i = in->get_raw_payload();
597 std::string& o = out->get_raw_payload();
598
599 // validate payload utf8
601 return make_error_code(error::invalid_payload);
602 }
603
605 bool masked = !base::m_server;
606 bool compressed = m_permessage_deflate.is_enabled()
607 && in->get_compressed();
608 bool fin = in->get_fin();
609
610 if (masked) {
611 // Generate masking key.
612 key.i = m_rng();
613 } else {
614 key.i = 0;
615 }
616
617 // prepare payload
618 if (compressed) {
619 // compress and store in o after header.
620 m_permessage_deflate.compress(i,o);
621
622 if (o.size() < 4) {
623 return make_error_code(error::general);
624 }
625
626 // Strip trailing 4 0x00 0x00 0xff 0xff bytes before writing to the
627 // wire
628 o.resize(o.size()-4);
629
630 // mask in place if necessary
631 if (masked) {
632 this->masked_copy(o,o,key);
633 }
634 } else {
635 // no compression, just copy data into the output buffer
636 o.resize(i.size());
637
638 // if we are masked, have the masking function write to the output
639 // buffer directly to avoid another copy. If not masked, copy
640 // directly without masking.
641 if (masked) {
642 this->masked_copy(i,o,key);
643 } else {
644 std::copy(i.begin(),i.end(),o.begin());
645 }
646 }
647
648 // generate header
649 frame::basic_header h(op,o.size(),fin,masked,compressed);
650
651 if (masked) {
652 frame::extended_header e(o.size(),key.i);
653 out->set_header(frame::prepare_header(h,e));
654 } else {
655 frame::extended_header e(o.size());
656 out->set_header(frame::prepare_header(h,e));
657 }
658
659 out->set_prepared(true);
660 out->set_opcode(op);
661
662 return lib::error_code();
663 }
@ invalid_payload
Processor encountered invalid payload data.
Definition base.hpp:81
bool validate(std::string const &s)
Validate a UTF8 string.
Here is the call graph for this function:

◆ prepare_ping()

template<typename config >
lib::error_code websocketpp::processor::hybi13< config >::prepare_ping ( std::string const & in,
message_ptr out ) const
inline

Definition at line 666 of file hybi13.hpp.

666 {
667 return this->prepare_control(frame::opcode::PING,in,out);
668 }
Here is the call graph for this function:

◆ prepare_pong()

template<typename config >
lib::error_code websocketpp::processor::hybi13< config >::prepare_pong ( std::string const & in,
message_ptr out ) const
inline

Definition at line 670 of file hybi13.hpp.

670 {
671 return this->prepare_control(frame::opcode::PONG,in,out);
672 }
Here is the call graph for this function:

◆ process_handshake()

template<typename config >
lib::error_code websocketpp::processor::hybi13< config >::process_handshake ( request_type const & req,
std::string const & subprotocol,
response_type & res ) const
inlinevirtual
Parameters
reqThe request to process
subprotocolThe subprotocol in use
resThe response to store the processed response in
Returns
An error code, 0 on success, non-zero for other errors

Implements websocketpp::processor::processor< config >.

Definition at line 187 of file hybi13.hpp.

189 {
190 std::string server_key = request.get_header("Sec-WebSocket-Key");
191
192 lib::error_code ec = process_handshake_key(server_key);
193
194 if (ec) {
195 return ec;
196 }
197
198 response.replace_header("Sec-WebSocket-Accept",server_key);
199 response.append_header("Upgrade",constants::upgrade_token);
200 response.append_header("Connection",constants::connection_token);
201
202 if (!subprotocol.empty()) {
203 response.replace_header("Sec-WebSocket-Protocol",subprotocol);
204 }
205
206 return lib::error_code();
207 }
lib::error_code process_handshake_key(std::string &key) const
Convert a client handshake key into a server response key in place.
Definition hybi13.hpp:711
Here is the call graph for this function:

◆ process_handshake_key()

template<typename config >
lib::error_code websocketpp::processor::hybi13< config >::process_handshake_key ( std::string & key) const
inlineprotected

Definition at line 711 of file hybi13.hpp.

711 {
712 key.append(constants::handshake_guid);
713
714 unsigned char message_digest[20];
715 sha1::calc(key.c_str(),key.length(),message_digest);
716 key = base64_encode(message_digest,20);
717
718 return lib::error_code();
719 }
void calc(void const *src, size_t bytelength, unsigned char *hash)
Calculate a SHA1 hash.
Definition sha1.hpp:127
Here is the call graph for this function:
Here is the caller graph for this function:

◆ process_payload_bytes()

template<typename config >
size_t websocketpp::processor::hybi13< config >::process_payload_bytes ( uint8_t * buf,
size_t len,
lib::error_code & ec )
inlineprotected

This function performs unmasking and uncompression, validates the decoded bytes, and writes them to the appropriate message buffer.

This member function will use the input buffer as stratch space for its work. The raw input bytes will not be preserved. This applies only to the bytes actually needed. At most min(m_bytes_needed,len) will be processed.

Parameters
bufInput/working buffer
lenLength of buf
Returns
Number of bytes processed or zero in case of an error

Definition at line 777 of file hybi13.hpp.

778 {
779 // unmask if masked
783 // TODO: SIMD masking
784 }
785
786 std::string & out = m_current_msg->msg_ptr->get_raw_payload();
787 size_t offset = out.size();
788
789 // decompress message if needed.
790 if (m_permessage_deflate.is_enabled()
791 && m_current_msg->msg_ptr->get_compressed())
792 {
793 // Decompress current buffer into the message buffer
794 ec = m_permessage_deflate.decompress(buf,len,out);
795 if (ec) {
796 return 0;
797 }
798 } else {
799 // No compression, straight copy
800 out.append(reinterpret_cast<char *>(buf),len);
801 }
802
803 // validate unmasked, decompressed values
804 if (m_current_msg->msg_ptr->get_opcode() == frame::opcode::TEXT) {
805 if (!m_current_msg->validator.decode(out.begin()+offset,out.end())) {
806 ec = make_error_code(error::invalid_utf8);
807 return 0;
808 }
809 }
810
812
813 return len;
814 }
bool decode(iterator_type begin, iterator_type end)
Advance validator state with input from an iterator pair.
size_t byte_mask_circ(uint8_t *input, uint8_t *output, size_t length, size_t prepared_key)
Circular byte aligned mask/unmask.
Definition frame.hpp:827
bool get_masked(basic_header const &h)
check whether the frame is masked
Definition frame.hpp:402
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ready()

template<typename config >
bool websocketpp::processor::hybi13< config >::ready ( ) const
inlinevirtual

Implements websocketpp::processor::processor< config >.

Definition at line 541 of file hybi13.hpp.

541 {
542 return (m_state == READY);
543 }
Here is the caller graph for this function:

◆ reset_headers()

template<typename config >
void websocketpp::processor::hybi13< config >::reset_headers ( )
inline

Definition at line 526 of file hybi13.hpp.

526 {
528 m_bytes_needed = frame::BASIC_HEADER_LENGTH;
529
530 m_basic_header.b0 = 0x00;
531 m_basic_header.b1 = 0x00;
532
533 std::fill_n(
535 frame::MAX_EXTENDED_HEADER_LENGTH,
536 0x00
537 );
538 }
Here is the caller graph for this function:

◆ validate_handshake()

template<typename config >
lib::error_code websocketpp::processor::hybi13< config >::validate_handshake ( request_type const & request) const
inlinevirtual
Parameters
requestThe WebSocket handshake request to validate. is_websocket_handshake(request) must be true and get_websocket_version(request) must equal this->get_version().
Returns
A status code, 0 on success, non-zero for specific sorts of failure

Implements websocketpp::processor::processor< config >.

Definition at line 163 of file hybi13.hpp.

163 {
164 if (r.get_method() != "GET") {
165 return make_error_code(error::invalid_http_method);
166 }
167
168 if (r.get_version() != "HTTP/1.1") {
169 return make_error_code(error::invalid_http_version);
170 }
171
172 // required headers
173 // Host is required by HTTP/1.1
174 // Connection is required by is_websocket_handshake
175 // Upgrade is required by is_websocket_handshake
176 if (r.get_header("Sec-WebSocket-Key").empty()) {
177 return make_error_code(error::missing_required_header);
178 }
179
180 return lib::error_code();
181 }
@ missing_required_header
Missing Required Header.
Definition base.hpp:129
@ invalid_http_method
Invalid HTTP method.
Definition base.hpp:120
@ invalid_http_version
Invalid HTTP version.
Definition base.hpp:123

◆ validate_incoming_basic_header()

template<typename config >
lib::error_code websocketpp::processor::hybi13< config >::validate_incoming_basic_header ( frame::basic_header const & h,
bool is_server,
bool new_msg ) const
inlineprotected

Validates an incoming hybi13 basic header.

Parameters
hThe basic header to validate
is_serverWhether or not the endpoint that received this frame is a server.
new_msgWhether or not this is the first frame of the message
Returns
0 on success or a non-zero error code on failure

Definition at line 826 of file hybi13.hpp.

828 {
830
831 // Check control frame size limit
833 frame::get_basic_size(h) > frame::limits::payload_size_basic)
834 {
835 return make_error_code(error::control_too_big);
836 }
837
838 // Check that RSV bits are clear
839 // The only RSV bits allowed are rsv1 if the permessage_compress
840 // extension is enabled for this connection and the message is not
841 // a control message.
842 //
843 // TODO: unit tests for this
844 if (frame::get_rsv1(h) && (!m_permessage_deflate.is_enabled()
846 {
847 return make_error_code(error::invalid_rsv_bit);
848 }
849
850 if (frame::get_rsv2(h) || frame::get_rsv3(h)) {
851 return make_error_code(error::invalid_rsv_bit);
852 }
853
854 // Check for reserved opcodes
856 return make_error_code(error::invalid_opcode);
857 }
858
859 // Check for invalid opcodes
860 // TODO: unit tests for this?
862 return make_error_code(error::invalid_opcode);
863 }
864
865 // Check for fragmented control message
867 return make_error_code(error::fragmented_control);
868 }
869
870 // Check for continuation without an active message
871 if (new_msg && op == frame::opcode::CONTINUATION) {
872 return make_error_code(error::invalid_continuation);
873 }
874
875 // Check for new data frame when expecting continuation
876 if (!new_msg && !frame::opcode::is_control(op) &&
878 {
879 return make_error_code(error::invalid_continuation);
880 }
881
882 // Servers should reject any unmasked frames from clients.
883 // Clients should reject any masked frames from servers.
884 if (is_server && !frame::get_masked(h)) {
885 return make_error_code(error::masking_required);
886 } else if (!is_server && frame::get_masked(h)) {
887 return make_error_code(error::masking_forbidden);
888 }
889
890 return lib::error_code();
891 }
bool invalid(value v)
Check if an opcode is invalid.
Definition frame.hpp:130
bool reserved(value v)
Check if an opcode is reserved.
Definition frame.hpp:118
uint8_t get_basic_size(basic_header const &)
Extracts the raw payload length specified in the basic header.
Definition frame.hpp:431
bool get_rsv3(basic_header const &h)
check whether the frame's RSV3 bit is set
Definition frame.hpp:375
bool get_rsv2(basic_header const &h)
check whether the frame's RSV2 bit is set
Definition frame.hpp:357
@ invalid_rsv_bit
Illegal use of reserved bit.
Definition base.hpp:93
@ masking_required
Clients may not send unmasked frames.
Definition base.hpp:102
@ masking_forbidden
Servers may not send masked frames.
Definition base.hpp:105
@ invalid_continuation
Continuation without message.
Definition base.hpp:99
@ fragmented_control
Fragmented control message.
Definition base.hpp:96
Here is the call graph for this function:
Here is the caller graph for this function:

◆ validate_incoming_extended_header()

template<typename config >
lib::error_code websocketpp::processor::hybi13< config >::validate_incoming_extended_header ( frame::basic_header h,
frame::extended_header e ) const
inlineprotected

Validates an incoming hybi13 full header.

Todo
unit test for the >32 bit frames on 32 bit systems case
Parameters
hThe basic header to validate
eThe extended header to validate
Returns
An error_code, non-zero values indicate why the validation failed

Definition at line 904 of file hybi13.hpp.

906 {
907 uint8_t basic_size = frame::get_basic_size(h);
908 uint64_t payload_size = frame::get_payload_size(h,e);
909
910 // Check for non-minimally encoded payloads
911 if (basic_size == frame::payload_size_code_16bit &&
912 payload_size <= frame::limits::payload_size_basic)
913 {
914 return make_error_code(error::non_minimal_encoding);
915 }
916
917 if (basic_size == frame::payload_size_code_64bit &&
918 payload_size <= frame::limits::payload_size_extended)
919 {
920 return make_error_code(error::non_minimal_encoding);
921 }
922
923 // Check for >32bit frames on 32 bit systems
924 if (sizeof(size_t) == 4 && (payload_size >> 32)) {
925 return make_error_code(error::requires_64bit);
926 }
927
928 return lib::error_code();
929 }
@ requires_64bit
Not supported on 32 bit systems.
Definition base.hpp:111
@ non_minimal_encoding
Payload length not minimally encoded.
Definition base.hpp:108
unsigned __int64 uint64_t
Definition stdint.h:136
Here is the call graph for this function:
Here is the caller graph for this function:

◆ validate_server_handshake_response()

template<typename config >
lib::error_code websocketpp::processor::hybi13< config >::validate_server_handshake_response ( request_type const & req,
response_type & res ) const
inlinevirtual
Parameters
reqThe original request sent
resThe reponse to generate
Returns
An error code, 0 on success, non-zero for other errors

Implements websocketpp::processor::processor< config >.

Definition at line 265 of file hybi13.hpp.

267 {
268 // A valid response has an HTTP 101 switching protocols code
269 if (res.get_status_code() != http::status_code::switching_protocols) {
271 }
272
273 // And the upgrade token in an upgrade header
274 std::string const & upgrade_header = res.get_header("Upgrade");
275 if (utility::ci_find_substr(upgrade_header, constants::upgrade_token,
276 sizeof(constants::upgrade_token)-1) == upgrade_header.end())
277 {
279 }
280
281 // And the websocket token in the connection header
282 std::string const & con_header = res.get_header("Connection");
283 if (utility::ci_find_substr(con_header, constants::connection_token,
284 sizeof(constants::connection_token)-1) == con_header.end())
285 {
287 }
288
289 // And has a valid Sec-WebSocket-Accept value
290 std::string key = req.get_header("Sec-WebSocket-Key");
291 lib::error_code ec = process_handshake_key(key);
292
293 if (ec || key != res.get_header("Sec-WebSocket-Accept")) {
295 }
296
297 // check extensions
298
299 return lib::error_code();
300 }
@ invalid_http_status
Invalid HTTP status.
Definition base.hpp:126
T::const_iterator ci_find_substr(T const &haystack, T const &needle, std::locale const &loc=std::locale())
Find substring (case insensitive)
Here is the call graph for this function:

Member Data Documentation

◆ m_basic_header

template<typename config >
frame::basic_header websocketpp::processor::hybi13< config >::m_basic_header
protected

Definition at line 1022 of file hybi13.hpp.

◆ m_bytes_needed

template<typename config >
size_t websocketpp::processor::hybi13< config >::m_bytes_needed
protected

Definition at line 1028 of file hybi13.hpp.

◆ m_control_msg

template<typename config >
msg_metadata websocketpp::processor::hybi13< config >::m_control_msg
protected

Definition at line 1036 of file hybi13.hpp.

◆ m_current_msg

template<typename config >
msg_metadata* websocketpp::processor::hybi13< config >::m_current_msg
protected

Definition at line 1039 of file hybi13.hpp.

◆ m_cursor

template<typename config >
size_t websocketpp::processor::hybi13< config >::m_cursor
protected

Definition at line 1031 of file hybi13.hpp.

◆ m_data_msg

template<typename config >
msg_metadata websocketpp::processor::hybi13< config >::m_data_msg
protected

Definition at line 1034 of file hybi13.hpp.

◆ m_extended_header

template<typename config >
frame::extended_header websocketpp::processor::hybi13< config >::m_extended_header
protected

Definition at line 1042 of file hybi13.hpp.

◆ m_msg_manager

template<typename config >
msg_manager_ptr websocketpp::processor::hybi13< config >::m_msg_manager
protected

Definition at line 1025 of file hybi13.hpp.

◆ m_permessage_deflate

template<typename config >
permessage_deflate_type websocketpp::processor::hybi13< config >::m_permessage_deflate
protected

Definition at line 1050 of file hybi13.hpp.

◆ m_rng

template<typename config >
rng_type& websocketpp::processor::hybi13< config >::m_rng
protected

Definition at line 1044 of file hybi13.hpp.

◆ m_state

template<typename config >
state websocketpp::processor::hybi13< config >::m_state
protected

Definition at line 1047 of file hybi13.hpp.


The documentation for this class was generated from the following file: