diff options
author | Carlos Garcia Campos <cgarcia@igalia.com> | 2022-10-11 14:59:46 +0200 |
---|---|---|
committer | Carlos Garcia Campos <cgarcia@igalia.com> | 2022-10-11 15:19:31 +0200 |
commit | 36721429a5e177f02bcd331b4f991f1a08c774ed (patch) | |
tree | 9927f25466f9902afe24e460eb96fe032d22e816 | |
parent | 053f2ac8cca77770311647fcfc45ae881cd68262 (diff) | |
download | libsoup-36721429a5e177f02bcd331b4f991f1a08c774ed.tar.gz |
server: ensure message socket is still available on websocket handler
Fixes #306
-rw-r--r-- | libsoup/server/soup-server-connection.c | 16 | ||||
-rw-r--r-- | libsoup/server/soup-server-connection.h | 2 | ||||
-rw-r--r-- | libsoup/server/soup-server-message.c | 9 | ||||
-rw-r--r-- | tests/websocket-test.c | 2 |
4 files changed, 15 insertions, 14 deletions
diff --git a/libsoup/server/soup-server-connection.c b/libsoup/server/soup-server-connection.c index f14058c2..ac0f1aaa 100644 --- a/libsoup/server/soup-server-connection.c +++ b/libsoup/server/soup-server-connection.c @@ -538,25 +538,31 @@ soup_server_connection_get_socket (SoupServerConnection *conn) return priv->socket; } -GSocket * -soup_server_connection_steal_socket (SoupServerConnection *conn) +GIOStream * +soup_server_connection_steal (SoupServerConnection *conn) { SoupServerConnectionPrivate *priv; - GSocket *socket; + GIOStream *stream; g_return_val_if_fail (SOUP_IS_SERVER_CONNECTION (conn), NULL); priv = soup_server_connection_get_instance_private (conn); + stream = priv->io_data ? soup_server_message_io_steal (priv->io_data) : NULL; + if (stream) { + g_object_set_data_full (G_OBJECT (stream), "GSocket", + priv->socket, g_object_unref); + } + /* Cache local and remote address */ soup_server_connection_get_local_address (conn); soup_server_connection_get_remote_address (conn); - socket = g_steal_pointer (&priv->socket); + g_clear_pointer (&priv->io_data, soup_server_message_io_destroy); g_clear_object (&priv->conn); g_clear_object (&priv->iostream); - return socket; + return stream; } GIOStream * diff --git a/libsoup/server/soup-server-connection.h b/libsoup/server/soup-server-connection.h index 50127cf8..31c1f3bd 100644 --- a/libsoup/server/soup-server-connection.h +++ b/libsoup/server/soup-server-connection.h @@ -30,7 +30,7 @@ gboolean soup_server_connection_is_ssl (So void soup_server_connection_disconnect (SoupServerConnection *conn); gboolean soup_server_connection_is_connected (SoupServerConnection *conn); GSocket *soup_server_connection_get_socket (SoupServerConnection *conn); -GSocket *soup_server_connection_steal_socket (SoupServerConnection *conn); +GIOStream *soup_server_connection_steal (SoupServerConnection *conn); GIOStream *soup_server_connection_get_iostream (SoupServerConnection *conn); GSocketAddress *soup_server_connection_get_local_address (SoupServerConnection *conn); GSocketAddress *soup_server_connection_get_remote_address (SoupServerConnection *conn); diff --git a/libsoup/server/soup-server-message.c b/libsoup/server/soup-server-message.c index 61d62a53..8f40d2a0 100644 --- a/libsoup/server/soup-server-message.c +++ b/libsoup/server/soup-server-message.c @@ -1103,15 +1103,8 @@ soup_server_message_steal_connection (SoupServerMessage *msg) GIOStream *stream; g_object_ref (msg); - stream = msg->io_data ? soup_server_message_io_steal (g_steal_pointer (&msg->io_data)) : NULL; - if (stream) { - g_object_set_data_full (G_OBJECT (stream), "GSocket", - soup_server_connection_steal_socket (msg->conn), - g_object_unref); - } - + stream = soup_server_connection_steal (msg->conn); g_signal_handlers_disconnect_by_data (msg, msg->conn); - connection_disconnected (msg); g_object_unref (msg); diff --git a/tests/websocket-test.c b/tests/websocket-test.c index e351443a..c9c7cffb 100644 --- a/tests/websocket-test.c +++ b/tests/websocket-test.c @@ -1571,6 +1571,8 @@ test_client_context_got_server_connection (SoupServer *server, g_assert_cmpstr (remote_ip, ==, str); g_free (str); + g_assert_nonnull (soup_server_message_get_socket (msg)); + test->server = g_object_ref (connection); } |