diff options
author | Carlos Garcia Campos <cgarcia@igalia.com> | 2022-11-08 16:28:12 +0100 |
---|---|---|
committer | Carlos Garcia Campos <cgarcia@igalia.com> | 2022-11-08 16:28:12 +0100 |
commit | d20c6601664624116f3dc43f21c7ec4a186cf8d3 (patch) | |
tree | 961222dc117093df832246d0123836bc625bbbfb /libsoup | |
parent | 6c06a44ac8eae1804924270b283613df76194ac4 (diff) | |
download | libsoup-d20c6601664624116f3dc43f21c7ec4a186cf8d3.tar.gz |
server: do not leak idle connections closed by the client
Diffstat (limited to 'libsoup')
-rw-r--r-- | libsoup/server/http1/soup-server-message-io-http1.c | 29 | ||||
-rw-r--r-- | libsoup/server/soup-server-private.h | 1 | ||||
-rw-r--r-- | libsoup/server/soup-server.c | 8 |
3 files changed, 24 insertions, 14 deletions
diff --git a/libsoup/server/http1/soup-server-message-io-http1.c b/libsoup/server/http1/soup-server-message-io-http1.c index 90139f2b..3803cabc 100644 --- a/libsoup/server/http1/soup-server-message-io-http1.c +++ b/libsoup/server/http1/soup-server-message-io-http1.c @@ -122,21 +122,22 @@ soup_server_message_io_http1_finished (SoupServerMessageIO *iface, g_object_ref (msg); g_clear_pointer (&io->msg_io, soup_message_io_http1_free); - if (completion_cb) - completion_cb (G_OBJECT (msg), completion, completion_data); conn = soup_server_message_get_connection (msg); - if (completion == SOUP_MESSAGE_IO_COMPLETE && - soup_server_connection_is_connected (conn) && - soup_server_message_is_keepalive (msg)) { - io->msg_io = soup_message_io_http1_new (soup_server_message_new (conn)); - io->msg_io->base.io_source = soup_message_io_data_get_source (&io->msg_io->base, - G_OBJECT (io->msg_io->msg), - io->istream, - io->ostream, - NULL, - (SoupMessageIOSourceFunc)io_run_ready, - NULL); - g_source_attach (io->msg_io->base.io_source, io->msg_io->async_context); + if (completion_cb) { + completion_cb (G_OBJECT (msg), completion, completion_data); + if (soup_server_connection_is_connected (conn)) { + io->msg_io = soup_message_io_http1_new (soup_server_message_new (conn)); + io->msg_io->base.io_source = soup_message_io_data_get_source (&io->msg_io->base, + G_OBJECT (io->msg_io->msg), + io->istream, + io->ostream, + NULL, + (SoupMessageIOSourceFunc)io_run_ready, + NULL); + g_source_attach (io->msg_io->base.io_source, io->msg_io->async_context); + } + } else { + soup_server_connection_disconnect (conn); } g_object_unref (msg); } diff --git a/libsoup/server/soup-server-private.h b/libsoup/server/soup-server-private.h index 7a90d7df..ca6ee708 100644 --- a/libsoup/server/soup-server-private.h +++ b/libsoup/server/soup-server-private.h @@ -10,5 +10,6 @@ void soup_server_set_http2_enabled (SoupServer *server, gboolean enabled); +GSList *soup_server_get_clients (SoupServer *server); #endif /* __SOUP_SERVER_PRIVATE_H__ */ diff --git a/libsoup/server/soup-server.c b/libsoup/server/soup-server.c index 6b486f56..1ea81fce 100644 --- a/libsoup/server/soup-server.c +++ b/libsoup/server/soup-server.c @@ -759,6 +759,14 @@ soup_server_get_listeners (SoupServer *server) return listeners; } +GSList * +soup_server_get_clients (SoupServer *server) +{ + SoupServerPrivate *priv = soup_server_get_instance_private (server); + + return priv->clients; +} + /* "" was never documented as meaning the same thing as "/", but it * effectively was. We have to special case it now or otherwise it * would match "*" too. |