diff options
author | Carlos Garcia Campos <cgarcia@igalia.com> | 2023-04-08 09:15:59 +0200 |
---|---|---|
committer | Carlos Garcia Campos <cgarcia@igalia.com> | 2023-04-08 09:15:59 +0200 |
commit | 517eb93f33e3d5dcf7ba059608114fc9e36b62af (patch) | |
tree | c308ac3c55b09b7f0782d977ec2e3e5ee0bdd6e7 | |
parent | c9123033837b76c2d24e3caeef461fcd4df0b23e (diff) | |
download | libsoup-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.c | 6 | ||||
-rw-r--r-- | tests/misc-test.c | 24 |
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 |