relay: add support of close frame in websocket connection (closes #1281)
parent
594917bff4
commit
de8d640958
|
@ -23,6 +23,7 @@ New features::
|
|||
* api: add functions string_base_encode and string_base_decode, remove functions string_encode_base64 and string_decode_base64
|
||||
* api: add support of Time-based One-Time Password (TOTP), add infos "totp_generate" and "totp_validate"
|
||||
* buflist: add variable ${number2}, always set with the indented buffer number
|
||||
* relay: add support of close frame in websocket connection (issue #1281)
|
||||
* relay: add support of Time-based One-Time Password (TOTP) as second authentication factor in weechat protocol
|
||||
|
||||
Bug fixes::
|
||||
|
|
|
@ -59,7 +59,7 @@ char *relay_client_data_type_string[] = /* strings for data types */
|
|||
{ "text", "binary" };
|
||||
|
||||
char *relay_client_msg_type_string[] = /* prefix in raw buffer for message */
|
||||
{ "", "[PING]\n", "[PONG]\n" };
|
||||
{ "", "[PING]\n", "[PONG]\n", "[CLOSE]\n" };
|
||||
|
||||
struct t_relay_client *relay_clients = NULL;
|
||||
struct t_relay_client *last_relay_client = NULL;
|
||||
|
@ -527,6 +527,24 @@ relay_client_recv_text_buffer (struct t_relay_client *client,
|
|||
strlen (buffer + index + 1),
|
||||
NULL);
|
||||
}
|
||||
else if (msg_type == RELAY_CLIENT_MSG_CLOSE)
|
||||
{
|
||||
/* print message in raw buffer */
|
||||
relay_raw_print (client, RELAY_CLIENT_MSG_CLOSE,
|
||||
RELAY_RAW_FLAG_RECV | RELAY_RAW_FLAG_BINARY,
|
||||
buffer + index + 1,
|
||||
strlen (buffer + index + 1));
|
||||
/* answer with a CLOSE */
|
||||
relay_client_send (client,
|
||||
RELAY_CLIENT_MSG_CLOSE,
|
||||
buffer + index + 1,
|
||||
strlen (buffer + index + 1),
|
||||
NULL);
|
||||
/* close the connection */
|
||||
relay_client_set_status (client, RELAY_STATUS_DISCONNECTED);
|
||||
/* ignore any other message after the close */
|
||||
return;
|
||||
}
|
||||
index++;
|
||||
}
|
||||
|
||||
|
@ -869,6 +887,7 @@ relay_client_send (struct t_relay_client *client,
|
|||
raw_size[0] = data_size;
|
||||
if ((msg_type == RELAY_CLIENT_MSG_PING)
|
||||
|| (msg_type == RELAY_CLIENT_MSG_PONG)
|
||||
|| (msg_type == RELAY_CLIENT_MSG_CLOSE)
|
||||
|| ((client->websocket != 1)
|
||||
&& (client->send_data_type == RELAY_CLIENT_DATA_BINARY)))
|
||||
{
|
||||
|
@ -897,6 +916,9 @@ relay_client_send (struct t_relay_client *client,
|
|||
case RELAY_CLIENT_MSG_PONG:
|
||||
opcode = WEBSOCKET_FRAME_OPCODE_PONG;
|
||||
break;
|
||||
case RELAY_CLIENT_MSG_CLOSE:
|
||||
opcode = WEBSOCKET_FRAME_OPCODE_CLOSE;
|
||||
break;
|
||||
default:
|
||||
opcode = (client->send_data_type == RELAY_CLIENT_DATA_TEXT) ?
|
||||
WEBSOCKET_FRAME_OPCODE_TEXT : WEBSOCKET_FRAME_OPCODE_BINARY;
|
||||
|
|
|
@ -58,6 +58,7 @@ enum t_relay_client_msg_type
|
|||
RELAY_CLIENT_MSG_STANDARD,
|
||||
RELAY_CLIENT_MSG_PING,
|
||||
RELAY_CLIENT_MSG_PONG,
|
||||
RELAY_CLIENT_MSG_CLOSE,
|
||||
/* number of message types */
|
||||
RELAY_NUM_CLIENT_MSG_TYPES,
|
||||
};
|
||||
|
|
|
@ -285,7 +285,8 @@ relay_raw_message_add (struct t_relay_client *client,
|
|||
|
||||
if (!(flags & RELAY_RAW_FLAG_BINARY)
|
||||
|| (msg_type == RELAY_CLIENT_MSG_PING)
|
||||
|| (msg_type == RELAY_CLIENT_MSG_PONG))
|
||||
|| (msg_type == RELAY_CLIENT_MSG_PONG)
|
||||
|| (msg_type == RELAY_CLIENT_MSG_CLOSE))
|
||||
{
|
||||
/* build prefix with arrow */
|
||||
prefix_arrow[0] = '\0';
|
||||
|
|
|
@ -322,8 +322,18 @@ relay_websocket_decode_frame (const unsigned char *buffer,
|
|||
index_buffer += 4;
|
||||
|
||||
/* copy opcode in decoded data */
|
||||
decoded[*decoded_length] = (opcode == WEBSOCKET_FRAME_OPCODE_PING) ?
|
||||
RELAY_CLIENT_MSG_PING : RELAY_CLIENT_MSG_STANDARD;
|
||||
switch (opcode)
|
||||
{
|
||||
case WEBSOCKET_FRAME_OPCODE_PING:
|
||||
decoded[*decoded_length] = RELAY_CLIENT_MSG_PING;
|
||||
break;
|
||||
case WEBSOCKET_FRAME_OPCODE_CLOSE:
|
||||
decoded[*decoded_length] = RELAY_CLIENT_MSG_CLOSE;
|
||||
break;
|
||||
default:
|
||||
decoded[*decoded_length] = RELAY_CLIENT_MSG_STANDARD;
|
||||
break;
|
||||
}
|
||||
*decoded_length += 1;
|
||||
|
||||
/* decode data using masks */
|
||||
|
|
Loading…
Reference in New Issue