diff options
Diffstat (limited to 'libsoup/soup-session.c')
-rw-r--r-- | libsoup/soup-session.c | 83 |
1 files changed, 23 insertions, 60 deletions
diff --git a/libsoup/soup-session.c b/libsoup/soup-session.c index 7a71324b..df61b3bb 100644 --- a/libsoup/soup-session.c +++ b/libsoup/soup-session.c @@ -3175,11 +3175,6 @@ async_send_request_return_result (SoupMessageQueueItem *item, task = item->task; item->task = NULL; - if (item->io_source) { - g_source_destroy (item->io_source); - g_clear_pointer (&item->io_source, g_source_unref); - } - if (error) g_task_return_error (task, error); else if (item->error) { @@ -3312,67 +3307,43 @@ send_async_maybe_complete (SoupMessageQueueItem *item, async_send_request_return_result (item, stream, NULL); } -static void try_run_until_read (SoupMessageQueueItem *item); - -static gboolean -read_ready_cb (SoupMessage *msg, gpointer user_data) -{ - SoupMessageQueueItem *item = user_data; - - g_clear_pointer (&item->io_source, g_source_unref); - try_run_until_read (item); - return FALSE; -} - static void -try_run_until_read (SoupMessageQueueItem *item) +run_until_read_done (SoupMessage *msg, + GAsyncResult *result, + SoupMessageQueueItem *item) { - GError *error = NULL; GInputStream *stream = NULL; + GError *error = NULL; - if (soup_message_io_run_until_read (item->msg, FALSE, item->cancellable, &error)) - stream = soup_message_io_get_response_istream (item->msg, &error); - if (stream) { - send_async_maybe_complete (item, stream); + soup_message_io_run_until_read_finish (msg, result, &error); + if (g_error_matches (error, SOUP_HTTP_ERROR, SOUP_STATUS_TRY_AGAIN)) return; - } - if (g_error_matches (error, SOUP_HTTP_ERROR, SOUP_STATUS_TRY_AGAIN)) { - item->state = SOUP_MESSAGE_RESTARTING; - soup_message_io_finished (item->msg); - g_error_free (error); - return; - } + if (!error) + stream = soup_message_io_get_response_istream (msg, &error); - if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) { - if (error->domain == G_TLS_ERROR) { - soup_message_set_status_full (item->msg, - SOUP_STATUS_SSL_FAILED, - error->message); - } - if (item->state != SOUP_MESSAGE_FINISHED) { - if (soup_message_io_in_progress (item->msg)) - soup_message_io_finished (item->msg); - item->state = SOUP_MESSAGE_FINISHING; - soup_session_process_queue_item (item->session, item, NULL, FALSE); - } - async_send_request_return_result (item, NULL, error); - return; + if (stream) { + send_async_maybe_complete (item, stream); + return; } - g_clear_error (&error); - item->io_source = soup_message_io_get_source (item->msg, item->cancellable, - read_ready_cb, item); - - SoupSessionPrivate *priv = soup_session_get_instance_private (item->session); - g_source_attach (item->io_source, priv->async_context); + if (item->state != SOUP_MESSAGE_FINISHED) { + if (soup_message_io_in_progress (msg)) + soup_message_io_finished (msg); + item->state = SOUP_MESSAGE_FINISHING; + soup_session_process_queue_item (item->session, item, NULL, FALSE); + } + async_send_request_return_result (item, NULL, error); } static void async_send_request_running (SoupSession *session, SoupMessageQueueItem *item) { item->io_started = TRUE; - try_run_until_read (item); + soup_message_io_run_until_read_async (item->msg, + item->cancellable, + (GAsyncReadyCallback)run_until_read_done, + item); } static void @@ -3718,19 +3689,11 @@ soup_session_send (SoupSession *session, break; /* Send request, read headers */ - if (!soup_message_io_run_until_read (msg, TRUE, item->cancellable, &my_error)) { + if (!soup_message_io_run_until_read (msg, item->cancellable, &my_error)) { if (g_error_matches (my_error, SOUP_HTTP_ERROR, SOUP_STATUS_TRY_AGAIN)) { - item->state = SOUP_MESSAGE_RESTARTING; - soup_message_io_finished (item->msg); g_clear_error (&my_error); continue; } - - if (my_error->domain == G_TLS_ERROR) { - soup_message_set_status_full (msg, - SOUP_STATUS_SSL_FAILED, - my_error->message); - } break; } |