diff options
author | Carlos Garcia Campos <cgarcia@igalia.com> | 2022-11-10 14:57:05 +0100 |
---|---|---|
committer | Carlos Garcia Campos <cgarcia@igalia.com> | 2022-11-10 14:57:05 +0100 |
commit | d3ed4372ea58d188b65692d227d53083107046c6 (patch) | |
tree | 7e209d833d82932f2c68924b1ef515d471178481 | |
parent | ab3767f07a075c9e1e847ac45559924eed9b4a3e (diff) | |
download | libsoup-d3ed4372ea58d188b65692d227d53083107046c6.tar.gz |
server: handle the case of connection being disconnected while message is paused
It can happen in http2, that one stream is paused, but the connection is
closed due to an io error, or the client closed the connection.
-rw-r--r-- | libsoup/server/soup-server-message.c | 4 | ||||
-rw-r--r-- | tests/http2-test.c | 3 | ||||
-rw-r--r-- | tests/misc-test.c | 3 | ||||
-rw-r--r-- | tests/timeout-test.c | 3 |
4 files changed, 8 insertions, 5 deletions
diff --git a/libsoup/server/soup-server-message.c b/libsoup/server/soup-server-message.c index ac34ad99..1450b047 100644 --- a/libsoup/server/soup-server-message.c +++ b/libsoup/server/soup-server-message.c @@ -605,9 +605,9 @@ void soup_server_message_unpause (SoupServerMessage *msg) { g_return_if_fail (SOUP_IS_SERVER_MESSAGE (msg)); - g_return_if_fail (msg->io_data != NULL); - soup_server_message_io_unpause (msg->io_data, msg); + if (msg->io_data) + soup_server_message_io_unpause (msg->io_data, msg); } gboolean diff --git a/tests/http2-test.c b/tests/http2-test.c index 89e0143f..d8a1e5f7 100644 --- a/tests/http2-test.c +++ b/tests/http2-test.c @@ -1174,6 +1174,7 @@ static gboolean unpause_message (SoupServerMessage *msg) { soup_server_message_unpause (msg); + g_object_unref (msg); return FALSE; } @@ -1200,7 +1201,7 @@ server_handler (SoupServer *server, soup_server_message_pause (msg); timeout = soup_add_timeout (g_main_context_get_thread_default (), is_timeout ? 4000 : 1000, - (GSourceFunc)unpause_message, msg); + (GSourceFunc)unpause_message, g_object_ref (msg)); g_source_unref (timeout); } } else if (strcmp (path, "/no-content") == 0) { diff --git a/tests/misc-test.c b/tests/misc-test.c index 55c34ac3..85b37598 100644 --- a/tests/misc-test.c +++ b/tests/misc-test.c @@ -22,6 +22,7 @@ static gboolean timeout_finish_message (gpointer msg) { soup_server_message_unpause (msg); + g_object_unref (msg); return FALSE; } @@ -68,7 +69,7 @@ server_callback (SoupServer *server, GSource *timeout; soup_server_message_pause (msg); timeout = soup_add_timeout (g_main_context_get_thread_default (), - 1000, timeout_finish_message, msg); + 1000, timeout_finish_message, g_object_ref (msg)); g_source_unref (timeout); } diff --git a/tests/timeout-test.c b/tests/timeout-test.c index 7a32e766..c0d11592 100644 --- a/tests/timeout-test.c +++ b/tests/timeout-test.c @@ -180,6 +180,7 @@ static gboolean timeout_finish_message (gpointer msg) { soup_server_message_unpause (msg); + g_object_unref (msg); return FALSE; } @@ -199,7 +200,7 @@ server_handler (SoupServer *server, GSource *timeout; soup_server_message_pause (msg); timeout = soup_add_timeout (g_main_context_get_thread_default (), - 4000, timeout_finish_message, msg); + 4000, timeout_finish_message, g_object_ref (msg)); g_source_unref (timeout); } } |