32 frame_header_is_valid,
33 payload_part_is_valid,
37 empty_mask_from_client_side,
38 non_final_control_frame,
40 payload_len_is_too_big,
42 continuation_frame_without_data_frame,
43 new_data_frame_without_finishing_previous,
57 static constexpr
const char* table[] =
60 "frame_header_is_valid",
61 "payload_part_is_valid",
64 "empty_mask_from_client_side",
65 "non_final_control_frame",
67 "payload_len_is_too_big",
68 "continuation_frame_without_data_frame",
69 "new_data_frame_without_finishing_previous",
74 return table[
static_cast<unsigned int>(state)];
89 return opcode == opcode_t::connection_close_frame ||
90 opcode == opcode_t::ping_frame ||
91 opcode == opcode_t::pong_frame;
106 return opcode == opcode_t::text_frame ||
107 opcode == opcode_t::binary_frame;
125 {::restinio::utils::impl::bitops::n_bits_from< std::uint8_t, 24 >(
127 ::restinio::utils::impl::bitops::n_bits_from< std::uint8_t, 16 >(
129 ::restinio::utils::impl::bitops::n_bits_from< std::uint8_t, 8 >(
131 ::restinio::utils::impl::bitops::n_bits_from< std::uint8_t, 0 >(
153 {::restinio::utils::impl::bitops::n_bits_from< std::uint8_t, 24 >(
155 ::restinio::utils::impl::bitops::n_bits_from< std::uint8_t, 16 >(
157 ::restinio::utils::impl::bitops::n_bits_from< std::uint8_t, 8 >(
159 ::restinio::utils::impl::bitops::n_bits_from< std::uint8_t, 0 >(
214 throw exception_t(
"another frame is processing now" );
221 case opcode_t::text_frame:
226 case opcode_t::binary_frame:
231 case opcode_t::connection_close_frame:
260 validation_state_t::payload_part_is_valid );
264 for(
size_t i = 0; i < size; ++i )
267 static_cast<std::uint8_t
>(data[i]) );
285 validation_state_t::payload_part_is_valid );
289 for(
size_t i = 0; i < size; ++i )
292 static_cast<std::uint8_t
>(data[i]) ));
336 return this_frame_validation_state;
364 validation_state_t::frame_header_is_valid );
369 validation_state_t::invalid_opcode );
374 validation_state_t::non_final_control_frame );
379 validation_state_t::empty_mask_from_client_side );
386 validation_state_t::non_zero_rsv_flags );
392 validation_state_t::payload_len_is_too_big );
427 uint16_t status_code{0};
463 opcode == opcode_t::continuation_frame )
466 validation_state_t::continuation_frame_without_data_frame );
475 validation_state_t::new_data_frame_without_finishing_previous );
487 if( close_code < 1000 ||
488 (close_code > 1011 && close_code < 3000) ||
492 validation_state_t::invalid_close_code );
497 if( close_code == 1004 ||
498 close_code == 1005 ||
502 validation_state_t::invalid_close_code );
537 validation_state_t::initial_state };