[libsoup] SoupSession: propagate GErrors to callers



commit 65bd4b98e2e5ed8518beb94fac05c9d9967cadb7
Author: Dan Winship <danw gnome org>
Date:   Tue Jul 9 12:27:37 2013 -0400

    SoupSession: propagate GErrors to callers
    
    When using soup_session_send() or soup_session_send_async(), propagate
    underlying GErrors to the caller, rather than constructing fake
    SOUP_HTTP_ERROR errors.

 libsoup/soup-message-queue.c |    1 +
 libsoup/soup-message-queue.h |    2 ++
 libsoup/soup-session.c       |   34 ++++++++++++++++++++++------------
 tests/misc-test.c            |    4 ++--
 4 files changed, 27 insertions(+), 14 deletions(-)
---
diff --git a/libsoup/soup-message-queue.c b/libsoup/soup-message-queue.c
index 3dced0e..4bc3726 100644
--- a/libsoup/soup-message-queue.c
+++ b/libsoup/soup-message-queue.c
@@ -183,6 +183,7 @@ soup_message_queue_item_unref (SoupMessageQueueItem *item)
        g_object_unref (item->session);
        g_object_unref (item->msg);
        g_object_unref (item->cancellable);
+       g_clear_error (&item->error);
        g_clear_object (&item->task);
        g_clear_pointer (&item->async_context, g_main_context_unref);
        if (item->io_source) {
diff --git a/libsoup/soup-message-queue.h b/libsoup/soup-message-queue.h
index d965e51..f86a129 100644
--- a/libsoup/soup-message-queue.h
+++ b/libsoup/soup-message-queue.h
@@ -38,6 +38,8 @@ struct _SoupMessageQueueItem {
        GMainContext *async_context;
 
        GCancellable *cancellable;
+       GError *error;
+
        SoupConnection *conn;
        GTask *task;
        GSource *io_source;
diff --git a/libsoup/soup-session.c b/libsoup/soup-session.c
index 0fa65cd..6f44935 100644
--- a/libsoup/soup-session.c
+++ b/libsoup/soup-session.c
@@ -1453,7 +1453,8 @@ soup_session_unqueue_item (SoupSession          *session,
 static void
 soup_session_set_item_status (SoupSession          *session,
                              SoupMessageQueueItem *item,
-                             guint                 status_code)
+                             guint                 status_code,
+                             GError               *error)
 {
        SoupURI *uri = NULL;
 
@@ -1481,7 +1482,9 @@ soup_session_set_item_status (SoupSession          *session,
                break;
        }
 
-       if (uri && uri->host) {
+       if (error)
+               soup_message_set_status_full (item->msg, status_code, error->message);
+       else if (uri && uri->host) {
                char *msg = g_strdup_printf ("%s (%s)",
                                             soup_status_get_phrase (status_code),
                                             uri->host);
@@ -1549,8 +1552,6 @@ status_from_connect_error (SoupMessageQueueItem *item, GError *error)
        } else
                status = SOUP_STATUS_IO_ERROR;
 
-       g_error_free (error);
-
        if (item->conn && soup_connection_is_via_proxy (item->conn))
                return soup_status_proxify (status);
        else
@@ -1571,12 +1572,14 @@ tunnel_complete (SoupMessageQueueItem *tunnel_item,
                item->state = SOUP_MESSAGE_FINISHING;
        soup_message_set_https_status (item->msg, item->conn);
 
+       item->error = error;
        if (!status)
                status = status_from_connect_error (item, error);
        if (!SOUP_STATUS_IS_SUCCESSFUL (status)) {
                soup_connection_disconnect (item->conn);
                soup_session_set_item_connection (session, item, NULL);
-               soup_session_set_item_status (session, item, status);
+               if (!item->new_api || item->msg->status_code == 0)
+                       soup_session_set_item_status (session, item, status, error);
        }
 
        item->state = SOUP_MESSAGE_READY;
@@ -1681,10 +1684,12 @@ connect_complete (SoupMessageQueueItem *item, SoupConnection *conn, GError *erro
                return;
        }
 
+       item->error = error;
        status = status_from_connect_error (item, error);
        soup_connection_disconnect (conn);
        if (item->state == SOUP_MESSAGE_CONNECTING) {
-               soup_session_set_item_status (session, item, status);
+               if (!item->new_api || item->msg->status_code == 0)
+                       soup_session_set_item_status (session, item, status, error);
                soup_session_set_item_connection (session, item, NULL);
                item->state = SOUP_MESSAGE_READY;
        }
@@ -3747,7 +3752,11 @@ async_send_request_return_result (SoupMessageQueueItem *item,
 
        if (error)
                g_task_return_error (task, error);
-       else if (SOUP_STATUS_IS_TRANSPORT_ERROR (item->msg->status_code)) {
+       else if (item->error) {
+               if (stream)
+                       g_object_unref (stream);
+               g_task_return_error (task, g_error_copy (item->error));
+       } else if (SOUP_STATUS_IS_TRANSPORT_ERROR (item->msg->status_code)) {
                if (stream)
                        g_object_unref (stream);
                g_task_return_new_error (task, SOUP_HTTP_ERROR,
@@ -4331,11 +4340,12 @@ soup_session_send (SoupSession   *session,
 
        if (my_error)
                g_propagate_error (error, my_error);
-       else if (SOUP_STATUS_IS_TRANSPORT_ERROR (msg->status_code)) {
-               if (stream) {
-                       g_object_unref (stream);
-                       stream = NULL;
-               }
+       else if (item->error) {
+               g_clear_object (&stream);
+               if (error)
+                       *error = g_error_copy (item->error);
+       } else if (SOUP_STATUS_IS_TRANSPORT_ERROR (msg->status_code)) {
+               g_clear_object (&stream);
                g_set_error_literal (error, SOUP_HTTP_ERROR, msg->status_code,
                                     msg->reason_phrase);
        } else if (!stream)
diff --git a/tests/misc-test.c b/tests/misc-test.c
index 73cc633..2aaa2cd 100644
--- a/tests/misc-test.c
+++ b/tests/misc-test.c
@@ -242,7 +242,7 @@ cur_one_completed (GObject *source, GAsyncResult *result, gpointer session)
        if (soup_request_send_finish (one, result, &error)) {
                debug_printf (1, "  Request 1 succeeded?\n");
                errors++;
-       } else if (!g_error_matches (error, SOUP_HTTP_ERROR, SOUP_STATUS_CANT_CONNECT)) {
+       } else if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CONNECTION_REFUSED)) {
                debug_printf (1, "  Unexpected error on Request 1: %s\n",
                              error->message);
                errors++;
@@ -269,7 +269,7 @@ cur_two_completed (GObject *source, GAsyncResult *result, gpointer loop)
        if (soup_request_send_finish (two, result, &error)) {
                debug_printf (1, "  Request 2 succeeded?\n");
                errors++;
-       } else if (!g_error_matches (error, SOUP_HTTP_ERROR, SOUP_STATUS_CANT_CONNECT)) {
+       } else if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CONNECTION_REFUSED)) {
                debug_printf (1, "  Unexpected error on Request 2: %s\n",
                              error->message);
                errors++;


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