From c8ff05b7308818b914ab7738fdaf3dbf5fa11e16 Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Sun, 23 Nov 2014 17:20:50 -0500 Subject: SoupConnection: fix connection in TLS_HANDSHAKING event signal SoupConnection was generating its own :event signals for TLS_HANDSHAKING/TLS_HANDSHAKED, since we don't use GSocketClient's TLS negotiation, and so just re-emitting the socket client signal won't cover that. However, it ended up emitting it before the SoupSocket had even created the GTlsClientConnection, and so was emitting it with the GTcpConnection, contrary to the documentation. Fix this by making the SoupSocket generate those event signals at the correct time, and having SoupConnection just re-emit them. Also, add code to connection-test to verify that each even is emitted with the expected kind of GIOStream. https://bugzilla.gnome.org/show_bug.cgi?id=739951 --- libsoup/soup-socket.c | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) (limited to 'libsoup/soup-socket.c') diff --git a/libsoup/soup-socket.c b/libsoup/soup-socket.c index 994d3dcf..8838ebac 100644 --- a/libsoup/soup-socket.c +++ b/libsoup/soup-socket.c @@ -810,6 +810,15 @@ soup_socket_new (const char *optname1, ...) return sock; } +static void +soup_socket_event (SoupSocket *sock, + GSocketClientEvent event, + GIOStream *connection) +{ + g_signal_emit (sock, signals[EVENT], 0, + event, connection); +} + static void re_emit_socket_client_event (GSocketClient *client, GSocketClientEvent event, @@ -819,8 +828,7 @@ re_emit_socket_client_event (GSocketClient *client, { SoupSocket *sock = user_data; - g_signal_emit (sock, signals[EVENT], 0, - event, connection); + soup_socket_event (sock, event, connection); } static gboolean @@ -1407,8 +1415,14 @@ soup_socket_handshake_sync (SoupSocket *sock, if (!soup_socket_setup_ssl (sock, ssl_host, cancellable, error)) return FALSE; - return g_tls_connection_handshake (G_TLS_CONNECTION (priv->conn), - cancellable, error); + soup_socket_event (sock, G_SOCKET_CLIENT_TLS_HANDSHAKING, priv->conn); + + if (!g_tls_connection_handshake (G_TLS_CONNECTION (priv->conn), + cancellable, error)) + return FALSE; + + soup_socket_event (sock, G_SOCKET_CLIENT_TLS_HANDSHAKED, priv->conn); + return TRUE; } static void @@ -1418,9 +1432,13 @@ handshake_async_ready (GObject *source, GAsyncResult *result, gpointer user_data GError *error = NULL; if (g_tls_connection_handshake_finish (G_TLS_CONNECTION (source), - result, &error)) + result, &error)) { + SoupSocket *sock = g_task_get_source_object (task); + SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (sock); + + soup_socket_event (sock, G_SOCKET_CLIENT_TLS_HANDSHAKED, priv->conn); g_task_return_boolean (task, TRUE); - else + } else g_task_return_error (task, error); g_object_unref (task); } @@ -1444,6 +1462,8 @@ soup_socket_handshake_async (SoupSocket *sock, return; } + soup_socket_event (sock, G_SOCKET_CLIENT_TLS_HANDSHAKING, priv->conn); + g_tls_connection_handshake_async (G_TLS_CONNECTION (priv->conn), G_PRIORITY_DEFAULT, cancellable, handshake_async_ready, -- cgit v1.2.1