81 std::uint32_t masking_key )
197 throw exception_t(
"Cannot add one more bytes to expected data.");
199 m_loaded_data.push_back(
static_cast<raw_data_t::value_type
>(
byte));
224 for(
const auto byte: data )
227 number |=
static_cast<std::uint8_t
>(
byte );
240 for(
auto i = 0 ; i < Bytes ; ++i )
242 auto shift_value = (Bytes - i - 1) * 8;
243 data.push_back(
static_cast<raw_data_t::value_type
>(
244 (number >> shift_value) & 0xFF) );
267 size_t parsed_bytes = 0;
269 while( parsed_bytes < size &&
272 byte_t byte =
static_cast< byte_t >( data[parsed_bytes] );
322 waiting_for_first_2_bytes,
324 waiting_for_mask_key,
393 size_t expected_data_size = payload_len;
457 std::uint8_t payload_len,
492 const std::size_t MASK_SIZE = 4;
493 const uint8_t
mask[ MASK_SIZE ] = {
494 n_bits_from< std::uint8_t, 24 >(masking_key),
495 n_bits_from< std::uint8_t, 16 >(masking_key),
496 n_bits_from< std::uint8_t, 8 >(masking_key),
497 n_bits_from< std::uint8_t, 0 >(masking_key),
500 const auto payload_size = payload.size();
501 for( std::size_t i = 0; i < payload_size; )
503 for( std::size_t j = 0; j < MASK_SIZE && i < payload_size; ++j, ++i )
505 payload[ i ] ^=
mask[ j ];
528 result.push_back(
static_cast<raw_data_t::value_type
>(
byte) );
540 result.push_back(
static_cast<raw_data_t::value_type
>(
byte) );
546 result.push_back(
static_cast<raw_data_t::value_type
>(
byte) );
550 write_number_to_big_endian_bytes< websocket_short_ext_payload_length>(
557 result.push_back(
static_cast<raw_data_t::value_type
>(
byte) );
561 write_number_to_big_endian_bytes< websocket_long_ext_payload_length >(
569 using ch_type = raw_data_t::value_type;
572 result.push_back( n_bits_from< ch_type, 24 >(key) );
573 result.push_back( n_bits_from< ch_type, 16 >(key) );
574 result.push_back( n_bits_from< ch_type, 8 >(key) );
575 result.push_back( n_bits_from< ch_type, 0 >(key) );
604 std::uint32_t masking_key )
Exception class for all exceptions thrown by RESTinio.
Websocket message class with more detailed protocol information.
std::uint64_t payload_len() const
Get payload len.
bool m_rsv1_flag
Reserved flags.
message_details_t()=default
std::uint32_t m_masking_key
Masking key.
std::uint8_t m_payload_len
Payload len.
message_details_t(final_frame_flag_t final_flag, opcode_t opcode, size_t payload_len, std::uint32_t masking_key)
std::uint64_t m_ext_payload_len
Ext payload len.
bool m_final_flag
Final flag.
message_details_t(final_frame_flag_t final_flag, opcode_t opcode, size_t payload_len) noexcept
void init_payload_len(size_t payload_len)
Initialize payload len.
bool m_mask_flag
Mask flag.
void set_masking_key(std::uint32_t value)
Set masking key.
void process_extended_length()
Process extended length.
message_details_t m_current_msg
Current websocket message details.
void reset()
Reset internal state.
const message_details_t & current_message() const
Get current mesasge details.
void process_byte(byte_t byte)
Process one byte of incoming buffer.
void parse_first_2_bytes(const raw_data_t &data)
Parse first two bytes of message from buffer.
void parse_ext_payload_len(std::uint8_t payload_len, const raw_data_t &data)
Parse extended length from buffer.
void parse_masking_key(bool mask_flag, const raw_data_t &data)
Parse masking key from buffer.
@ waiting_for_first_2_bytes
size_t parser_execute(const char *data, size_t size)
Parse piece of data from buffer.
void process_masking_key()
Process extended length.
bool header_parsed() const
Check header of current websocket message is parsed.
state_t m_current_state
Current state.
expected_data_t m_expected_data
Buffer for parts of websocket message with known size.
void process_first_2_bytes()
Process first two bytes of message.
constexpr T mask(unsigned bits_to_extract)
unsigned int byte(digest_t::value_type v)
void read_number_from_big_endian_bytes(T &number, const raw_data_t &data)
Read number from buffer with network bytes order.
void mask_unmask_payload(std::uint32_t masking_key, raw_data_t &payload)
Do msak/unmask operation with buffer.
constexpr byte_t bit_flag_7
constexpr size_t websocket_max_payload_size_without_ext
constexpr size_t websocket_long_ext_payload_length
raw_data_t write_message_details(const message_details_t &message)
Serialize websocket message details into bytes buffer.
constexpr size_t websocket_short_ext_len_code
constexpr byte_t bit_flag_5
constexpr byte_t payload_len_mask
constexpr byte_t bit_flag_4
constexpr size_t websocket_short_ext_payload_length
constexpr byte_t bit_flag_6
constexpr byte_t opcode_mask
constexpr size_t websocket_long_ext_len_code
constexpr size_t websocket_masking_key_size
constexpr size_t websocket_first_two_bytes_size
Websocket parser constants.
void write_number_to_big_endian_bytes(std::uint64_t &number, raw_data_t &data)
Save number to buffer with network bytes order.
std::string raw_data_t
Bytes buffer.
unsigned char byte_t
Alias for byte.
constexpr final_frame_flag_t final_frame
final_frame_flag_t
WS frame (message) "final"/"not final" flag.
bool add_byte_and_check_size(byte_t byte)
Try to add one more byte to loaded data and check loaded data size.
void reset(size_t expected_size)
Reset internal state on next expected data size.
bool all_bytes_loaded() const
Check all bytes are loaded.
expected_data_t()=default
expected_data_t(size_t expected_size)
size_t m_expected_size
Expected data size in bytes.
raw_data_t m_loaded_data
Buffer for accumulating data.