summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukáš Tyrychtr <lukastyrychtr@gmail.com>2022-11-24 09:17:56 +0000
committerCarlos Garcia Campos <carlosgc@gnome.org>2022-11-24 09:17:56 +0000
commit8d5f7c4355be873c812aba44bd2b5e30727511e2 (patch)
tree8671a0fcb9cb6d177176a642a27a289a8fa2d1a9
parent7328710927154033e0d4f5bf429f03ea3b210a54 (diff)
downloadlibsoup-8d5f7c4355be873c812aba44bd2b5e30727511e2.tar.gz
soupWebsocket: don't add the protocols header if it would be empty
Fixes #314
-rw-r--r--libsoup/websocket/soup-websocket.c9
-rw-r--r--tests/websocket-test.c58
2 files changed, 63 insertions, 4 deletions
diff --git a/libsoup/websocket/soup-websocket.c b/libsoup/websocket/soup-websocket.c
index f0829d4e..64e66fd0 100644
--- a/libsoup/websocket/soup-websocket.c
+++ b/libsoup/websocket/soup-websocket.c
@@ -209,7 +209,7 @@ choose_subprotocol (SoupServerMessage *msg,
client_protocols = g_strsplit_set (client_protocols_str, ", ", -1);
if (!client_protocols || !client_protocols[0]) {
g_strfreev (client_protocols);
- return TRUE;
+ return FALSE;
}
for (i = 0; server_protocols[i] != NULL; i++) {
@@ -273,12 +273,13 @@ soup_websocket_client_prepare_handshake (SoupMessage *msg,
if (origin)
soup_message_headers_replace_common (soup_message_get_request_headers (msg), SOUP_HEADER_ORIGIN, origin);
- if (protocols) {
+ if (protocols && *protocols) {
char *protocols_str;
protocols_str = g_strjoinv (", ", protocols);
- soup_message_headers_replace_common (soup_message_get_request_headers (msg),
- SOUP_HEADER_SEC_WEBSOCKET_PROTOCOL, protocols_str);
+ if (*protocols_str)
+ soup_message_headers_replace_common (soup_message_get_request_headers (msg),
+ SOUP_HEADER_SEC_WEBSOCKET_PROTOCOL, protocols_str);
g_free (protocols_str);
}
diff --git a/tests/websocket-test.c b/tests/websocket-test.c
index c9c7cffb..e105fc1d 100644
--- a/tests/websocket-test.c
+++ b/tests/websocket-test.c
@@ -907,6 +907,58 @@ test_protocol_client_any_soup (Test *test,
g_assert_cmpstr (soup_message_headers_get_one (soup_message_get_response_headers (test->msg), "Sec-WebSocket-Protocol"), ==, NULL);
}
+static const char *invalid_protocols[] = { "", NULL };
+
+static void
+test_soup_websocket_client_prepare_handshake_ignores_invalid_protocols (Test *test,
+ gconstpointer unused)
+{
+ SoupMessage *msg;
+ char *protocol;
+ msg = soup_message_new ("GET", "http://127.0.0.1");
+ soup_websocket_client_prepare_handshake (msg, NULL, (char **) invalid_protocols, NULL);
+
+ protocol = soup_message_headers_get_one (soup_message_get_request_headers (msg), "Sec-WebSocket-Protocol");
+ g_assert_cmpstr (protocol, ==, NULL);
+}
+
+static void
+test_protocol_client_invalid_direct (Test *test,
+ gconstpointer unused)
+{
+ SoupMessage *msg;
+ SoupServerMessage *server_msg;
+ SoupMessageHeaders *request_headers;
+ SoupMessageHeaders *response_headers;
+ SoupMessageHeadersIter iter;
+ const char *name, *value;
+ gboolean ok;
+ const char *protocol;
+ GError *error = NULL;
+
+ msg = soup_message_new ("GET", "http://127.0.0.1");
+ soup_websocket_client_prepare_handshake (msg, NULL, NULL, NULL);
+ soup_message_headers_append (soup_message_get_request_headers (msg), "Sec-WebSocket-Protocol", "");
+
+ server_msg = g_object_new (SOUP_TYPE_SERVER_MESSAGE, NULL);
+ soup_server_message_set_method (server_msg, soup_message_get_method (msg));
+ soup_server_message_set_uri (server_msg, soup_message_get_uri (msg));
+ request_headers = soup_server_message_get_request_headers (server_msg);
+ soup_message_headers_iter_init (&iter, soup_message_get_request_headers (msg));
+ while (soup_message_headers_iter_next (&iter, &name, &value))
+ soup_message_headers_append (request_headers, name, value);
+ ok = soup_websocket_server_check_handshake (server_msg, NULL, (char **) all_protocols, NULL, &error);
+ g_assert_error (error, SOUP_WEBSOCKET_ERROR, SOUP_WEBSOCKET_ERROR_BAD_HANDSHAKE);
+ g_assert_false (ok);
+
+ ok = soup_websocket_server_process_handshake (server_msg, NULL, (char **) all_protocols, NULL, NULL);
+ g_assert_false (ok);
+
+
+ g_object_unref (msg);
+ g_object_unref (server_msg);
+}
+
typedef enum {
CLOSE_TEST_FLAG_SERVER = 1 << 0,
CLOSE_TEST_FLAG_CLIENT = 1 << 1
@@ -2166,6 +2218,12 @@ main (int argc,
test_protocol_client_any_soup,
teardown_soup_connection);
+ g_test_add ("/websocket/direct/invalid-protocols-ignored", Test, NULL, NULL,
+ test_soup_websocket_client_prepare_handshake_ignores_invalid_protocols,
+ NULL);
+ g_test_add ("/websocket/direct/invalid-protocols-rejected", Test, NULL, NULL,
+ test_protocol_client_invalid_direct,
+ NULL);
g_test_add ("/websocket/direct/receive-fragmented", Test, NULL,
setup_half_direct_connection,