summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Winship <danw@gnome.org>2013-07-09 12:27:37 -0400
committerDan Winship <danw@gnome.org>2013-10-19 20:39:50 -0400
commit65bd4b98e2e5ed8518beb94fac05c9d9967cadb7 (patch)
tree184b56b81d8ec0f36216130455593cfbb40bac11
parent665a6e44005b4a0d5e4911b81e89d9984695e40b (diff)
downloadlibsoup-65bd4b98e2e5ed8518beb94fac05c9d9967cadb7.tar.gz
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.
-rw-r--r--libsoup/soup-message-queue.c1
-rw-r--r--libsoup/soup-message-queue.h2
-rw-r--r--libsoup/soup-session.c34
-rw-r--r--tests/misc-test.c4
4 files changed, 27 insertions, 14 deletions
diff --git a/libsoup/soup-message-queue.c b/libsoup/soup-message-queue.c
index 3dced0e4..4bc37267 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 d965e513..f86a1296 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 0fa65cda..6f44935f 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 73cc6333..2aaa2cd4 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++;