39 :
public std::enable_shared_from_this< ws_t >
119 if( restinio::writable_item_type_t::trivial_write_operation ==
127 final_flag, opcode, asio_ns::buffer_size( payload.
buf() ) };
132 bufs.emplace_back(
std::move( payload ) );
138 wg.after_write_notificator(
std::move( wscb ) );
142 const bool is_close_frame =
143 opcode_t::connection_close_frame == opcode;
161 throw exception_t{
"ws doesn't support sendfile" };
166 throw exception_t{
"websocket is not available" };
213 typename WS_Message_Handler >
223 WS_Message_Handler ws_message_handler )
228 if( !upgrade_response_header_fields.
has_field( http_field::sec_websocket_accept ) )
231 fmt::format(
"{} field is mandatory for upgrade response",
244 throw exception_t{
"no connection for upgrade: already moved" };
246 auto & con =
dynamic_cast< connection_t &
>( *conn_ptr );
250 auto upgrade_internals = con.move_upgrade_internals();
252 std::make_shared< ws_connection_t >(
254 std::move( upgrade_internals.m_settings ),
256 std::move( upgrade_internals.m_lifetime_monitor ),
262 upgrade_response_header.swap_fields( upgrade_response_header_fields );
265 const auto content_length_flag =
268 upgrade_response_bufs.emplace_back(
270 upgrade_response_header,
271 content_length_flag ) );
274 ws_connection->write_data(
281 if( activation_t::immediate == activation_flag )
292 typename WS_Message_Handler >
297 std::string sec_websocket_accept_field_value,
298 WS_Message_Handler ws_message_handler )
301 upgrade_response_header_fields.
set_field(
302 http_field::sec_websocket_accept,
303 std::move( sec_websocket_accept_field_value ) );
306 upgrade< Traits, WS_Message_Handler >(
309 std::move( upgrade_response_header_fields ),
315 typename WS_Message_Handler >
320 std::string sec_websocket_accept_field_value,
321 std::string sec_websocket_protocol_field_value,
322 WS_Message_Handler ws_message_handler )
325 upgrade_response_header_fields.
set_field(
326 http_field::sec_websocket_accept,
327 std::move( sec_websocket_accept_field_value ) );
329 upgrade_response_header_fields.
set_field(
330 http_field::sec_websocket_protocol,
331 std::move( sec_websocket_protocol_field_value ) );
334 upgrade< Traits, WS_Message_Handler >(
337 std::move( upgrade_response_header_fields ),
343 typename WS_Message_Handler >
348 WS_Message_Handler ws_message_handler )
350 const char * websocket_accept_field_suffix =
"258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
353 websocket_accept_field_suffix;
361 upgrade_response_header_fields.
set_field(
362 http_field::sec_websocket_accept,
363 std::move( sec_websocket_accept_field_value ) );
366 upgrade< Traits, WS_Message_Handler >(
369 std::move( upgrade_response_header_fields ),