28 #ifndef WEBSOCKETPP_FRAME_HPP 29 #define WEBSOCKETPP_FRAME_HPP 131 return (v > 0xF || v < 0);
195 bool rsv1 =
false,
bool rsv2 =
false,
bool rsv3 =
false) : b0(0x00),
219 basic_value =
static_cast<uint8_t
>(
size);
237 std::fill_n(this->bytes,MAX_EXTENDED_HEADER_LENGTH,0x00);
241 std::fill_n(this->bytes,MAX_EXTENDED_HEADER_LENGTH,0x00);
243 copy_payload(payload_size);
247 std::fill_n(this->bytes,MAX_EXTENDED_HEADER_LENGTH,0x00);
250 int offset = copy_payload(payload_size);
254 temp32.
i = masking_key;
255 std::copy(temp32.
c,temp32.
c+4,bytes+offset);
260 int copy_payload(uint64_t payload_size) {
261 int payload_offset = 0;
271 std::copy(temp64.
c+payload_offset,temp64.
c+8,bytes);
273 return 8-payload_offset;
302 template <
typename input_iter,
typename output_iter>
303 void byte_mask(input_iter b, input_iter e, output_iter o, masking_key_type
304 const & key,
size_t key_offset = 0);
305 template <
typename iter_type>
306 void byte_mask(iter_type b, iter_type e, masking_key_type
const & key,
307 size_t key_offset = 0);
309 masking_key_type
const & key);
310 void word_mask_exact(uint8_t * data,
size_t length, masking_key_type
const &
312 size_t word_mask_circ(uint8_t * input, uint8_t * output,
size_t length,
313 size_t prepared_key);
314 size_t word_mask_circ(uint8_t * data,
size_t length,
size_t prepared_key);
322 return ((h.
b0 & BHB0_FIN) == BHB0_FIN);
340 return ((h.
b0 & BHB0_RSV1) == BHB0_RSV1);
358 return ((h.
b0 & BHB0_RSV2) == BHB0_RSV2);
376 return ((h.
b0 & BHB0_RSV3) == BHB0_RSV3);
403 return ((h.
b1 & BHB1_MASK) == BHB1_MASK);
494 ret.push_back(
char(h.
b0));
495 ret.push_back(
char(h.
b1));
497 reinterpret_cast<const char*>(e.
bytes),
498 get_header_len(h)-BASIC_HEADER_LENGTH
519 masking_key_type temp32;
525 std::copy(e.
bytes+offset,e.
bytes+offset+4,temp32.
c);
543 return ntohs(temp16.
i);
580 }
else if (val == payload_size_code_16bit) {
596 size_t low_bits =
static_cast<size_t>(key.
i);
598 if (
sizeof(
size_t) == 8) {
599 uint64_t high_bits =
static_cast<size_t>(key.
i);
600 return static_cast<size_t>((high_bits << 32) | low_bits);
617 size_t temp = prepared_key << (
sizeof(
size_t)-offset)*8;
618 return (prepared_key >> offset*8) | temp;
620 size_t temp = prepared_key >> (
sizeof(
size_t)-offset)*8;
621 return (prepared_key << offset*8) | temp;
644 template <
typename input_iter,
typename output_iter>
645 void byte_mask(input_iter first, input_iter last, output_iter result,
646 masking_key_type
const & key,
size_t key_offset)
648 size_t key_index = key_offset%4;
649 while (first != last) {
650 *result = *first ^ key.
c[key_index++];
674 template <
typename iter_type>
675 void byte_mask(iter_type b, iter_type e, masking_key_type
const & key,
703 const masking_key_type& key)
706 size_t n = length/
sizeof(
size_t);
707 size_t* input_word =
reinterpret_cast<size_t*
>(input);
708 size_t* output_word =
reinterpret_cast<size_t*
>(output);
710 for (
size_t i = 0;
i < n;
i++) {
711 output_word[
i] = input_word[
i] ^ prepared_key;
714 for (
size_t i = n*
sizeof(
size_t);
i < length;
i++) {
715 output[
i] = input[
i] ^ key.
c[
i%4];
732 masking_key_type& key)
771 size_t n = length /
sizeof(
size_t);
772 size_t l = length - (n *
sizeof(
size_t));
773 size_t * input_word =
reinterpret_cast<size_t *
>(input);
774 size_t * output_word =
reinterpret_cast<size_t *
>(output);
777 for (
size_t i = 0;
i < n;
i++) {
778 output_word[
i] = input_word[
i] ^ prepared_key;
782 size_t start = length - l;
783 uint8_t * byte_key =
reinterpret_cast<uint8_t *
>(&prepared_key);
784 for (
size_t i = 0;
i < l; ++
i) {
785 output[start+
i] = input[start+
i] ^ byte_key[
i];
834 key.
i = prepared_key;
836 for (
size_t i = 0;
i < length; ++
i) {
837 output[
i] = input[
i] ^ key.
c[
i % 4];
864 #endif //WEBSOCKETPP_FRAME_HPP bool is_control(value v)
Check if an opcode is for a control frame.
bool invalid(value v)
Check if an opcode is invalid.
static uint8_t const payload_size_code_16bit
static uint8_t const BHB0_RSV2
bool get_rsv1(basic_header const &h)
check whether the frame's RSV1 bit is set
void set_rsv1(basic_header &h, bool value)
Set the frame's RSV1 bit.
static uint8_t const BHB0_RSV3
bool get_rsv3(basic_header const &h)
check whether the frame's RSV3 bit is set
bool get_masked(basic_header const &h)
check whether the frame is masked
std::string write_header(basic_header const &, extended_header const &)
span_CONFIG_SIZE_TYPE size_t
static uint8_t const BHB1_MASK
uint16_t get_extended_size(extended_header const &)
Extract the extended size field from an extended header.
bool get_rsv2(basic_header const &h)
check whether the frame's RSV2 bit is set
static uint8_t const BHB1_PAYLOAD
static unsigned int const max_header_length
Maximum length of a WebSocket header.
opcode::value get_opcode(basic_header const &h)
Extract opcode from basic header.
uint64_t _htonll(uint64_t src)
Convert 64 bit value to network byte order.
static uint8_t const payload_size_basic
Maximum size of a basic WebSocket payload.
masking_key_type get_masking_key(basic_header const &, extended_header const &)
Extract the masking key from a frame header.
Eight byte conversion union.
Two byte conversion union.
Four byte conversion union.
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.
static uint64_t const payload_size_jumbo
Maximum size of a jumbo WebSocket payload (basic payload = 127)
size_t get_header_len(basic_header const &)
Calculates the full length of the header based on the first bytes.
size_t circshift_prepared_key(size_t prepared_key, size_t offset)
circularly shifts the supplied prepared masking key by offset bytes
static unsigned int const basic_header_length
Minimum length of a WebSocket frame header.
size_t word_mask_circ(uint8_t *input, uint8_t *output, size_t length, size_t prepared_key)
Circular word aligned mask/unmask.
static uint8_t const BHB0_OPCODE
uint64_t _ntohll(uint64_t src)
Convert 64 bit value to host byte order.
void word_mask_exact(uint8_t *input, uint8_t *output, size_t length, masking_key_type const &key)
Exact word aligned mask/unmask.
size_t prepare_masking_key(masking_key_type const &key)
Extract a masking key into a value the size of a machine word.
uint32_converter masking_key_type
uint8_t get_basic_size(basic_header const &)
Extracts the raw payload length specified in the basic header.
uint64_t get_jumbo_size(extended_header const &)
Extract the jumbo size field from an extended header.
Namespace for the WebSocket++ project.
uint64_t get_payload_size(basic_header const &, extended_header const &)
Extract the full payload size field from a WebSocket header.
static unsigned int const MAX_EXTENDED_HEADER_LENGTH
Maximum length of the variable portion of the WebSocket header.
void close(T *e, websocketpp::connection_hdl hdl)
static uint8_t const payload_size_code_64bit
unsigned int get_masking_key_offset(basic_header const &)
Calculate the offset location of the masking key within the extended header.
static unsigned int const max_extended_header_length
Maximum length of the variable portion of the WebSocket header.
static unsigned int const MAX_HEADER_LENGTH
Maximum length of a WebSocket header.
void set_masked(basic_header &h, bool value)
Set the frame's MASK bit.
std::string prepare_header(const basic_header &h, const extended_header &e)
Generate a properly sized contiguous string that encodes a full frame header.
static uint16_t const payload_size_extended
Maximum size of an extended WebSocket payload (basic payload = 126)
size_t byte_mask_circ(uint8_t *input, uint8_t *output, size_t length, size_t prepared_key)
Circular byte aligned mask/unmask.
static uint8_t const close_reason_size
Maximum size of close frame reason.
span_constexpr std::size_t size(span< T, Extent > const &spn)
static uint8_t const BHB0_FIN
void set_fin(basic_header &h, bool value)
Set the frame's FIN bit.
bool reserved(value v)
Check if an opcode is reserved.
bool get_fin(basic_header const &h)
Check whether the frame's FIN bit is set.
static uint8_t const BHB0_RSV1
void set_rsv2(basic_header &h, bool value)
Set the frame's RSV2 bit.
static unsigned int const BASIC_HEADER_LENGTH
Minimum length of a WebSocket frame header.
void set_rsv3(basic_header &h, bool value)
Set the frame's RSV3 bit.