diff options
| author | Dan Winship <danw@gnome.org> | 2012-05-08 12:53:21 -0400 |
|---|---|---|
| committer | Dan Winship <danw@gnome.org> | 2012-05-08 12:53:21 -0400 |
| commit | 88632261d3610daed00d1db46a6dc909d39e889e (patch) | |
| tree | 0277157636af7cc82ccb23a850fe8b0b5270268d /libsoup/soup-message-io.c | |
| parent | ba24747c476428745f25b86ed617e68088ab4418 (diff) | |
| download | libsoup-88632261d3610daed00d1db46a6dc909d39e889e.tar.gz | |
Add a (temporary?) fix for async authentication via SoupRequest
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
Diffstat (limited to 'libsoup/soup-message-io.c')
| -rw-r--r-- | libsoup/soup-message-io.c | 58 |
1 files changed, 47 insertions, 11 deletions
diff --git a/libsoup/soup-message-io.c b/libsoup/soup-message-io.c index b4456d6f..145d809c 100644 --- a/libsoup/soup-message-io.c +++ b/libsoup/soup-message-io.c @@ -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 ( |
