relay: add support of close frame in websocket connection (closes #1281)

v2.8-utf8proc
Sébastien Helleu 2018-11-12 20:43:48 +01:00
parent 594917bff4
commit de8d640958
5 changed files with 39 additions and 4 deletions

View File

@ -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::

View File

@ -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;

View File

@ -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,
};

View File

@ -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';

View File

@ -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 */