SoupMessagePrivate *priv = SOUP_MESSAGE_GET_PRIVATE (msg);
SoupMessageIOData *io = priv->io_data;
GError *error = NULL;
+ GCancellable *cancellable;
if (io->io_source) {
g_source_destroy (io->io_source);
}
g_object_ref (msg);
+ cancellable = io->cancellable ? g_object_ref (io->cancellable) : NULL;
if (io_run_until (msg,
SOUP_MESSAGE_IO_STATE_DONE,
SOUP_MESSAGE_IO_STATE_DONE,
- io->cancellable, &error)) {
+ cancellable, &error)) {
soup_message_io_finished (msg);
} else if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) {
g_clear_error (&error);
}
g_object_unref (msg);
+ g_clear_object (&cancellable);
+
return FALSE;
}
}
static void
+set_done (SoupSession *session, SoupMessage *msg, gpointer user_data)
+{
+ gboolean *done = user_data;
+
+ *done = TRUE;
+}
+
+static void
do_cancel_while_reading_test_for_session (SoupSession *session)
{
SoupMessage *msg;
GThread *thread = NULL;
SoupURI *uri;
+ gboolean done = FALSE;
uri = soup_uri_new_with_base (base_uri, "/slow");
msg = soup_message_new_from_uri ("GET", uri);
else
thread = g_thread_new ("cancel_message_thread", cancel_message_thread, msg);
- soup_session_send_message (session, msg);
+ /* We intentionally don't use soup_session_send_message() here,
+ * because it holds an extra ref on the SoupMessageQueueItem
+ * relative to soup_session_queue_message().
+ */
+ g_object_ref (msg);
+ soup_session_queue_message (session, msg, set_done, &done);
+ while (!done)
+ g_main_context_iteration (NULL, TRUE);
if (msg->status_code != SOUP_STATUS_CANCELLED) {
debug_printf (1, " FAILED: %d %s (expected Cancelled)\n",