summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garcia Campos <cgarcia@igalia.com>2023-04-08 09:15:59 +0200
committerCarlos Garcia Campos <cgarcia@igalia.com>2023-04-08 09:15:59 +0200
commit517eb93f33e3d5dcf7ba059608114fc9e36b62af (patch)
treec308ac3c55b09b7f0782d977ec2e3e5ee0bdd6e7
parentc9123033837b76c2d24e3caeef461fcd4df0b23e (diff)
downloadlibsoup-517eb93f33e3d5dcf7ba059608114fc9e36b62af.tar.gz
session: handle request cancellation earlier
Check if the message was cancelled on every queue state loop iteration.
-rw-r--r--libsoup/soup-session.c6
-rw-r--r--tests/misc-test.c24
2 files changed, 29 insertions, 1 deletions
diff --git a/libsoup/soup-session.c b/libsoup/soup-session.c
index 4d4c8654..5acf60a8 100644
--- a/libsoup/soup-session.c
+++ b/libsoup/soup-session.c
@@ -1740,6 +1740,9 @@ soup_session_process_queue_item (SoupSession *session,
if (item->paused)
return;
+ if (item->state != SOUP_MESSAGE_FINISHING && g_cancellable_is_cancelled (item->cancellable))
+ item->state = SOUP_MESSAGE_FINISHING;
+
switch (item->state) {
case SOUP_MESSAGE_STARTING:
if (!soup_session_ensure_item_connection (session, item))
@@ -2907,7 +2910,8 @@ conditional_get_ready_cb (SoupSession *session,
stream = soup_session_send_finish (session, result, &error);
if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
soup_cache_cancel_conditional_request (data->cache, data->conditional_msg);
- cancel_cache_response (data->item);
+ if (data->item->state != SOUP_MESSAGE_FINISHED)
+ cancel_cache_response (data->item);
async_cache_conditional_data_free (data);
return;
}
diff --git a/tests/misc-test.c b/tests/misc-test.c
index 045161d8..4c14bb87 100644
--- a/tests/misc-test.c
+++ b/tests/misc-test.c
@@ -430,6 +430,14 @@ ea_message_starting (SoupMessage *msg,
}
static void
+ea_message_queued (SoupSession *session,
+ SoupMessage *msg,
+ GCancellable *cancellable)
+{
+ g_cancellable_cancel (cancellable);
+}
+
+static void
do_early_abort_test (void)
{
SoupSession *session;
@@ -488,6 +496,22 @@ do_early_abort_test (void)
g_object_unref (cancellable);
g_object_unref (msg);
soup_test_session_abort_unref (session);
+
+ session = soup_test_session_new (NULL);
+ msg = soup_message_new_from_uri ("GET", base_uri);
+ cancellable = g_cancellable_new ();
+
+ g_signal_connect (session, "request-queued",
+ G_CALLBACK (ea_message_queued), cancellable);
+ g_assert_null (soup_test_session_async_send (session, msg, cancellable, &error));
+ debug_printf (2, " Message 4 completed\n");
+
+ g_assert_cmpuint (soup_message_get_connection_id (msg), ==, 0);
+ g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED);
+ g_clear_error (&error);
+ g_object_unref (cancellable);
+ g_object_unref (msg);
+ soup_test_session_abort_unref (session);
}
static void