Add a (temporary?) fix for async authentication via SoupRequest
authorDan Winship <danw@gnome.org>
Tue, 8 May 2012 16:53:21 +0000 (12:53 -0400)
committerDan Winship <danw@gnome.org>
Tue, 8 May 2012 16:53:21 +0000 (12:53 -0400)
In order to do async authentication, we need to stop the processing of
the request during the soup_request_send_async() call. So re-enable
soup_session_pause_message() for that case. Possibly to be revisited.

https://bugzilla.gnome.org/show_bug.cgi?id=675306

libsoup/soup-message-io.c
libsoup/soup-session.c

index b4456d6..145d809 100644 (file)
@@ -690,20 +690,32 @@ io_read (SoupMessage *msg, GCancellable *cancellable, GError **error)
 typedef struct {
        GSource source;
        SoupMessage *msg;
+       gboolean paused;
 } SoupMessageSource;
 
 static gboolean
-message_source_prepare (GSource *source,
-                       gint    *timeout)
+message_source_check (GSource *source)
 {
-       *timeout = -1;
-       return FALSE;
+       SoupMessageSource *message_source = (SoupMessageSource *)source;
+
+       if (message_source->paused) {
+               SoupMessagePrivate *priv = SOUP_MESSAGE_GET_PRIVATE (message_source->msg);
+               SoupMessageIOData *io = priv->io_data;
+
+               if (!io || io->paused)
+                       return FALSE;
+               else
+                       return TRUE;
+       } else
+               return FALSE;
 }
 
 static gboolean
-message_source_check (GSource *source)
+message_source_prepare (GSource *source,
+                       gint    *timeout)
 {
-       return FALSE;
+       *timeout = -1;
+       return message_source_check (source);
 }
 
 static gboolean
@@ -767,7 +779,11 @@ soup_message_io_get_source (SoupMessage *msg, GCancellable *cancellable,
        GSource *base_source, *source;
        SoupMessageSource *message_source;
 
-       if (io && SOUP_MESSAGE_IO_STATE_POLLABLE (io->read_state)) {
+       if (!io) {
+               base_source = g_timeout_source_new (0);
+       } else if (io->paused) {
+               base_source = NULL;
+       } else if (SOUP_MESSAGE_IO_STATE_POLLABLE (io->read_state)) {
                GPollableInputStream *istream;
 
                if (io->body_istream)
@@ -775,7 +791,7 @@ soup_message_io_get_source (SoupMessage *msg, GCancellable *cancellable,
                else
                        istream = G_POLLABLE_INPUT_STREAM (io->istream);
                base_source = g_pollable_input_stream_create_source (istream, cancellable);
-       } else if (io && SOUP_MESSAGE_IO_STATE_POLLABLE (io->write_state)) {
+       } else if (SOUP_MESSAGE_IO_STATE_POLLABLE (io->write_state)) {
                GPollableOutputStream *ostream;
 
                if (io->body_ostream)
@@ -786,15 +802,18 @@ soup_message_io_get_source (SoupMessage *msg, GCancellable *cancellable,
        } else
                base_source = g_timeout_source_new (0);
 
-       g_source_set_dummy_callback (base_source);
        source = g_source_new (&message_source_funcs,
                               sizeof (SoupMessageSource));
        g_source_set_name (source, "SoupMessageSource");
        message_source = (SoupMessageSource *)source;
        message_source->msg = g_object_ref (msg);
+       message_source->paused = io && io->paused;
 
-       g_source_add_child_source (source, base_source);
-       g_source_unref (base_source);
+       if (base_source) {
+               g_source_set_dummy_callback (base_source);
+               g_source_add_child_source (source, base_source);
+               g_source_unref (base_source);
+       }
        g_source_set_callback (source, (GSourceFunc) callback, user_data, NULL);
        return source;
 }
@@ -848,6 +867,14 @@ io_run_until (SoupMessage *msg,
        done = (io->read_state >= read_state &&
                io->write_state >= write_state);
 
+       if (io->paused && !done) {
+               g_set_error_literal (error, G_IO_ERROR,
+                                    G_IO_ERROR_WOULD_BLOCK,
+                                    _("Operation would block"));
+               g_object_unref (msg);
+               return FALSE;
+       }
+
        g_object_unref (msg);
        return done;
 }
@@ -1059,6 +1086,9 @@ soup_message_io_pause (SoupMessage *msg)
 
        g_return_if_fail (io != NULL);
 
+       if (io->item && io->item->new_api)
+               g_return_if_fail (io->read_state < SOUP_MESSAGE_IO_STATE_BODY);
+
        if (io->io_source) {
                g_source_destroy (io->io_source);
                g_source_unref (io->io_source);
@@ -1098,6 +1128,12 @@ soup_message_io_unpause (SoupMessage *msg)
 
        g_return_if_fail (io != NULL);
 
+       if (io->item && io->item->new_api) {
+               g_return_if_fail (io->read_state < SOUP_MESSAGE_IO_STATE_BODY);
+               io->paused = FALSE;
+               return;
+       }
+
        if (!io->blocking) {
                if (!io->unpause_source) {
                        io->unpause_source = soup_add_completion (
index be630a8..fc8d345 100644 (file)
@@ -2228,7 +2228,6 @@ soup_session_pause_message (SoupSession *session,
        priv = SOUP_SESSION_GET_PRIVATE (session);
        item = soup_message_queue_lookup (priv->queue, msg);
        g_return_if_fail (item != NULL);
-       g_return_if_fail (!item->new_api);
 
        item->paused = TRUE;
        if (item->state == SOUP_MESSAGE_RUNNING)
@@ -2261,7 +2260,6 @@ soup_session_unpause_message (SoupSession *session,
        priv = SOUP_SESSION_GET_PRIVATE (session);
        item = soup_message_queue_lookup (priv->queue, msg);
        g_return_if_fail (item != NULL);
-       g_return_if_fail (!item->new_api);
 
        item->paused = FALSE;
        if (item->state == SOUP_MESSAGE_RUNNING)