[libsoup/carlosgc/http2-read-io-error.diff] http2: check status of pending messages after a read IO error




commit 183a36b7dbd22b6d58ba7f58c006ffc600131c35
Author: Carlos Garcia Campos <cgarcia igalia com>
Date:   Mon Dec 20 11:33:56 2021 +0100

    http2: check status of pending messages after a read IO error
    
    Fixes #256

 libsoup/http2/soup-client-message-io-http2.c |  6 +++++-
 tests/http2-server.py                        |  6 ++++++
 tests/http2-test.c                           | 23 +++++++++++++++++++++++
 3 files changed, 34 insertions(+), 1 deletion(-)
---
diff --git a/libsoup/http2/soup-client-message-io-http2.c b/libsoup/http2/soup-client-message-io-http2.c
index e5d08106..2dd1e356 100644
--- a/libsoup/http2/soup-client-message-io-http2.c
+++ b/libsoup/http2/soup-client-message-io-http2.c
@@ -477,8 +477,12 @@ io_read_ready (GObject                  *stream,
                 return G_SOURCE_CONTINUE;
         }
 
-        if (error)
+        if (error) {
                 set_io_error (io, error);
+                g_list_foreach (io->pending_io_messages,
+                                (GFunc)soup_http2_message_data_check_status,
+                                NULL);
+        }
 
         io->is_shutdown = TRUE;
 
diff --git a/tests/http2-server.py b/tests/http2-server.py
index 977aff15..adccc2ea 100755
--- a/tests/http2-server.py
+++ b/tests/http2-server.py
@@ -44,6 +44,12 @@ async def slow():
     await asyncio.sleep(1)
     return 'Hello world'
 
+@app.route('/timeout')
+async def timeout():
+    set_timeout()
+    await asyncio.sleep(4)
+    return 'Hello world'
+
 @app.route('/no-content')
 async def no_content():
     set_timeout()
diff --git a/tests/http2-test.c b/tests/http2-test.c
index c566505a..8ac00173 100644
--- a/tests/http2-test.c
+++ b/tests/http2-test.c
@@ -994,6 +994,25 @@ do_sniffer_sync_test (Test *test, gconstpointer data)
         do_one_sniffer_test (test->session, "https://127.0.0.1:5000/no-content";, 0, FALSE, NULL);
 }
 
+static void
+do_timeout_test (Test *test, gconstpointer data)
+{
+        SoupMessage *msg;
+        GBytes *response;
+        GError *error = NULL;
+
+        soup_session_set_timeout (test->session, 2);
+
+        msg = soup_message_new (SOUP_METHOD_GET, "https://127.0.0.1:5000/timeout";);
+        response = soup_test_session_async_send (test->session, msg, NULL, &error);
+        g_assert_null (response);
+        g_assert_error (error, G_IO_ERROR, G_IO_ERROR_TIMED_OUT);
+        g_object_unref (msg);
+
+        while (g_main_context_pending (NULL))
+                g_main_context_iteration (NULL, FALSE);
+}
+
 int
 main (int argc, char **argv)
 {
@@ -1102,6 +1121,10 @@ main (int argc, char **argv)
                     setup_session,
                     do_sniffer_sync_test,
                     teardown_session);
+        g_test_add ("/http2/timeout", Test, NULL,
+                    setup_session,
+                    do_timeout_test,
+                    teardown_session);
 
        ret = g_test_run ();
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]