diff options
author | Sébastien Helleu <flashcode@flashtux.org> | 2018-11-12 20:43:48 +0100 |
---|---|---|
committer | Sébastien Helleu <flashcode@flashtux.org> | 2018-11-12 20:43:48 +0100 |
commit | de8d6409584bb318d26359ba518af34da3833c83 (patch) | |
tree | ccf45862089f39902b8d076e63a987729f0d3fbd /src/plugins | |
parent | 594917bff4b2b7f799d131b76feca39809bf5461 (diff) | |
download | weechat-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.c | 24 | ||||
-rw-r--r-- | src/plugins/relay/relay-client.h | 1 | ||||
-rw-r--r-- | src/plugins/relay/relay-raw.c | 3 | ||||
-rw-r--r-- | src/plugins/relay/relay-websocket.c | 14 |
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 */ |