summaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
authorSébastien Helleu <flashcode@flashtux.org>2018-11-12 20:43:48 +0100
committerSébastien Helleu <flashcode@flashtux.org>2018-11-12 20:43:48 +0100
commitde8d6409584bb318d26359ba518af34da3833c83 (patch)
treeccf45862089f39902b8d076e63a987729f0d3fbd /src/plugins
parent594917bff4b2b7f799d131b76feca39809bf5461 (diff)
downloadweechat-de8d6409584bb318d26359ba518af34da3833c83.zip
relay: add support of close frame in websocket connection (closes #1281)
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/relay/relay-client.c24
-rw-r--r--src/plugins/relay/relay-client.h1
-rw-r--r--src/plugins/relay/relay-raw.c3
-rw-r--r--src/plugins/relay/relay-websocket.c14
4 files changed, 38 insertions, 4 deletions
diff --git a/src/plugins/relay/relay-client.c b/src/plugins/relay/relay-client.c
index c94baff45..1c8e48e4b 100644
--- a/src/plugins/relay/relay-client.c
+++ b/src/plugins/relay/relay-client.c
@@ -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;
diff --git a/src/plugins/relay/relay-client.h b/src/plugins/relay/relay-client.h
index 91d61c664..4a8d88c43 100644
--- a/src/plugins/relay/relay-client.h
+++ b/src/plugins/relay/relay-client.h
@@ -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,
};
diff --git a/src/plugins/relay/relay-raw.c b/src/plugins/relay/relay-raw.c
index b3f78e603..a8b0cb862 100644
--- a/src/plugins/relay/relay-raw.c
+++ b/src/plugins/relay/relay-raw.c
@@ -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';
diff --git a/src/plugins/relay/relay-websocket.c b/src/plugins/relay/relay-websocket.c
index c0398061e..f33198531 100644
--- a/src/plugins/relay/relay-websocket.c
+++ b/src/plugins/relay/relay-websocket.c
@@ -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 */