[libsoup] SoupConnection: disconnect on failed connections/tunnels
- From: Dan Winship <danw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libsoup] SoupConnection: disconnect on failed connections/tunnels
- Date: Fri, 2 Nov 2012 19:31:43 +0000 (UTC)
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]