summaryrefslogtreecommitdiff
path: root/libsoup/soup-socket.c
diff options
context:
space:
mode:
authorDan Winship <danw@gnome.org>2014-11-23 17:20:50 -0500
committerDan Winship <danw@gnome.org>2014-11-23 17:23:53 -0500
commitc8ff05b7308818b914ab7738fdaf3dbf5fa11e16 (patch)
tree161c1ef2cd08683ecb9e265696ef42569b97737f /libsoup/soup-socket.c
parentb24ef29be4ccd9b051d75b15b290448b5490bc53 (diff)
downloadlibsoup-c8ff05b7308818b914ab7738fdaf3dbf5fa11e16.tar.gz
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
Diffstat (limited to 'libsoup/soup-socket.c')
-rw-r--r--libsoup/soup-socket.c32
1 files changed, 26 insertions, 6 deletions
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
@@ -811,6 +811,15 @@ soup_socket_new (const char *optname1, ...)
}
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,
GSocketConnectable *connectable,
@@ -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,