summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garcia Campos <cgarcia@igalia.com>2022-11-10 14:57:05 +0100
committerCarlos Garcia Campos <cgarcia@igalia.com>2022-11-10 14:57:05 +0100
commitd3ed4372ea58d188b65692d227d53083107046c6 (patch)
tree7e209d833d82932f2c68924b1ef515d471178481
parentab3767f07a075c9e1e847ac45559924eed9b4a3e (diff)
downloadlibsoup-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.c4
-rw-r--r--tests/http2-test.c3
-rw-r--r--tests/misc-test.c3
-rw-r--r--tests/timeout-test.c3
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);
}
}