[libsoup] SoupConnection: disconnect on failed connections/tunnels



commit 21d707d66460233596a04f6dc99c945d2dbc3085
Author: Dan Winship <danw gnome org>
Date:   Wed Oct 24 14:04:48 2012 +0200

    SoupConnection: disconnect on failed connections/tunnels
    
    Rather than relying on SoupSession to call
    soup_connection_disconnect() after a connection or tunnel attempt
    fails, have SoupConnection do it itself.

 libsoup/soup-connection.c    |   16 +++++++++++++---
 libsoup/soup-session-async.c |   14 ++++++--------
 libsoup/soup-session-sync.c  |   34 +++++++++++++++-------------------
 libsoup/soup-session.c       |    5 ++---
 4 files changed, 36 insertions(+), 33 deletions(-)
---
diff --git a/libsoup/soup-connection.c b/libsoup/soup-connection.c
index 2cdcc30..34b9b2d 100644
--- a/libsoup/soup-connection.c
+++ b/libsoup/soup-connection.c
@@ -474,6 +474,8 @@ socket_connect_finished (SoupSocket *socket, guint status, gpointer user_data)
 			status = soup_status_proxify (status);
 		data->callback (data->conn, status, data->callback_data);
 	}
+	if (!SOUP_STATUS_IS_SUCCESSFUL (status) && status != SOUP_STATUS_TRY_AGAIN)
+		soup_connection_disconnect (data->conn);
 	g_object_unref (data->conn);
 	if (data->cancellable)
 		g_object_unref (data->cancellable);
@@ -639,7 +641,6 @@ soup_connection_connect_sync (SoupConnection *conn, GCancellable *cancellable)
 				 SOUP_SOCKET_CLEAN_DISPOSE, TRUE,
 				 NULL);
 	g_object_unref (remote_addr);
-
 	event_id = g_signal_connect (priv->socket, "event",
 				     G_CALLBACK (proxy_socket_event), conn);
 	status = soup_socket_connect_sync (priv->socket, cancellable);
@@ -678,13 +679,15 @@ soup_connection_connect_sync (SoupConnection *conn, GCancellable *cancellable)
 		soup_connection_set_state (conn, SOUP_CONNECTION_IN_USE);
 		priv->unused_timeout = time (NULL) + SOUP_CONNECTION_UNUSED_TIMEOUT;
 		start_idle_timer (conn);
-	} else {
+	} else if (status != SOUP_STATUS_TRY_AGAIN) {
 	fail:
 		if (priv->socket) {
 			soup_socket_disconnect (priv->socket);
 			g_object_unref (priv->socket);
 			priv->socket = NULL;
 		}
+
+		soup_connection_disconnect (conn);
 	}
 
 	if (priv->socket)
@@ -718,8 +721,10 @@ soup_connection_start_ssl_sync (SoupConnection *conn,
 
 	if (!soup_socket_start_proxy_ssl (priv->socket,
 					  priv->remote_uri->host,
-					  cancellable))
+					  cancellable)) {
+		soup_connection_disconnect (conn);
 		return SOUP_STATUS_SSL_FAILED;
+	}
 
 	soup_connection_event (conn, G_SOCKET_CLIENT_TLS_HANDSHAKING, NULL);
 	status = soup_socket_handshake_sync (priv->socket, cancellable);
@@ -731,6 +736,9 @@ soup_connection_start_ssl_sync (SoupConnection *conn,
 		status = SOUP_STATUS_TRY_AGAIN;
 	}
 
+	if (!SOUP_STATUS_IS_SUCCESSFUL (status) && status != SOUP_STATUS_TRY_AGAIN)
+		soup_connection_disconnect (conn);
+
 	return status;
 }
 
@@ -749,6 +757,8 @@ start_ssl_completed (SoupSocket *socket, guint status, gpointer user_data)
 	}
 
 	data->callback (data->conn, status, data->callback_data);
+	if (!SOUP_STATUS_IS_SUCCESSFUL (status) && status != SOUP_STATUS_TRY_AGAIN)
+		soup_connection_disconnect (data->conn);
 	g_object_unref (data->conn);
 	g_slice_free (SoupConnectionAsyncConnectData, data);
 }
diff --git a/libsoup/soup-session-async.c b/libsoup/soup-session-async.c
index 8706091..d26fbe2 100644
--- a/libsoup/soup-session-async.c
+++ b/libsoup/soup-session-async.c
@@ -127,7 +127,6 @@ ssl_tunnel_completed (SoupConnection *conn, guint status, gpointer user_data)
 	soup_message_queue_item_unref (tunnel_item);
 
 	if (!SOUP_STATUS_IS_SUCCESSFUL (status)) {
-		soup_connection_disconnect (item->conn);
 		soup_session_set_item_connection (session, item, NULL);
 		soup_message_set_status (item->msg, status);
 	}
@@ -174,13 +173,12 @@ got_connection (SoupConnection *conn, guint status, gpointer user_data)
 	SoupMessageQueueItem *item = user_data;
 	SoupSession *session = item->session;
 
-	if (item->state != SOUP_MESSAGE_CONNECTING) {
-		soup_connection_disconnect (conn);
-	} else if (status != SOUP_STATUS_OK) {
-		soup_session_set_item_status (session, item, status);
-		soup_connection_disconnect (item->conn);
-		soup_session_set_item_connection (session, item, NULL);
-		item->state = SOUP_MESSAGE_READY;
+	if (status != SOUP_STATUS_OK) {
+		if (item->state == SOUP_MESSAGE_CONNECTING) {
+			soup_session_set_item_status (session, item, status);
+			soup_session_set_item_connection (session, item, NULL);
+			item->state = SOUP_MESSAGE_READY;
+		}
 	} else
 		item->state = SOUP_MESSAGE_CONNECTED;
 
diff --git a/libsoup/soup-session-sync.c b/libsoup/soup-session-sync.c
index c532c97..43d0a49 100644
--- a/libsoup/soup-session-sync.c
+++ b/libsoup/soup-session-sync.c
@@ -140,9 +140,6 @@ tunnel_connect (SoupSession *session, SoupMessageQueueItem *related)
 		soup_message_set_https_status (related->msg, conn);
 	}
 
-	if (!SOUP_STATUS_IS_SUCCESSFUL (status))
-		soup_connection_disconnect (conn);
-
 	g_object_unref (conn);
 	return status;
 }
@@ -167,33 +164,32 @@ try_again:
 		try_pruning = FALSE;
 	}
 
-	if (soup_connection_get_state (item->conn) != SOUP_CONNECTION_NEW) {
+	if (soup_connection_get_state (item->conn) == SOUP_CONNECTION_IDLE) {
 		item->state = SOUP_MESSAGE_READY;
 		return;
 	}
 
-	status = soup_connection_connect_sync (item->conn, item->cancellable);
-	if (status == SOUP_STATUS_TRY_AGAIN) {
-		soup_connection_disconnect (item->conn);
-		soup_session_set_item_connection (session, item, NULL);
-		goto try_again;
-	}
+	if (soup_connection_get_state (item->conn) == SOUP_CONNECTION_NEW) {
+		status = soup_connection_connect_sync (item->conn, item->cancellable);
+		if (status == SOUP_STATUS_TRY_AGAIN) {
+			soup_session_set_item_connection (session, item, NULL);
+			goto try_again;
+		}
 
-	soup_message_set_https_status (msg, item->conn);
+		soup_message_set_https_status (msg, item->conn);
 
-	if (!SOUP_STATUS_IS_SUCCESSFUL (status)) {
-		if (!msg->status_code)
-			soup_session_set_item_status (session, item, status);
-		item->state = SOUP_MESSAGE_FINISHING;
-		soup_connection_disconnect (item->conn);
-		soup_session_set_item_connection (session, item, NULL);
-		return;
+		if (!SOUP_STATUS_IS_SUCCESSFUL (status)) {
+			if (!msg->status_code)
+				soup_session_set_item_status (session, item, status);
+			item->state = SOUP_MESSAGE_FINISHING;
+			soup_session_set_item_connection (session, item, NULL);
+			return;
+		}
 	}
 
 	if (soup_connection_is_tunnelled (item->conn)) {
 		status = tunnel_connect (session, item);
 		if (!SOUP_STATUS_IS_SUCCESSFUL (status)) {
-			soup_connection_disconnect (item->conn);
 			soup_session_set_item_connection (session, item, NULL);
 			if (status == SOUP_STATUS_TRY_AGAIN)
 				goto try_again;
diff --git a/libsoup/soup-session.c b/libsoup/soup-session.c
index 9715688..b0a9862 100644
--- a/libsoup/soup-session.c
+++ b/libsoup/soup-session.c
@@ -1355,9 +1355,8 @@ soup_session_unqueue_item (SoupSession          *session,
 	SoupSessionHost *host;
 
 	if (item->conn) {
-		if ((soup_connection_get_state (item->conn) == SOUP_CONNECTION_IN_USE) &&
-		    (item->msg->method != SOUP_METHOD_CONNECT ||
-		     !SOUP_STATUS_IS_SUCCESSFUL (item->msg->status_code)))
+		if (item->msg->method != SOUP_METHOD_CONNECT ||
+		    !SOUP_STATUS_IS_SUCCESSFUL (item->msg->status_code))
 			soup_connection_set_state (item->conn, SOUP_CONNECTION_IDLE);
 		soup_session_set_item_connection (session, item, NULL);
 	}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]