diff options
author | Carlos Garcia Campos <cgarcia@igalia.com> | 2022-11-10 12:50:19 +0100 |
---|---|---|
committer | Carlos Garcia Campos <cgarcia@igalia.com> | 2022-11-10 12:50:19 +0100 |
commit | ab3767f07a075c9e1e847ac45559924eed9b4a3e (patch) | |
tree | 78b337fe847ab522f11df235bff9fe492b94865b /libsoup | |
parent | d20c6601664624116f3dc43f21c7ec4a186cf8d3 (diff) | |
download | libsoup-ab3767f07a075c9e1e847ac45559924eed9b4a3e.tar.gz |
server: close http/2 connection after io error or goaway received
Diffstat (limited to 'libsoup')
-rw-r--r-- | libsoup/server/http2/soup-server-message-io-http2.c | 44 |
1 files changed, 30 insertions, 14 deletions
diff --git a/libsoup/server/http2/soup-server-message-io-http2.c b/libsoup/server/http2/soup-server-message-io-http2.c index e9e2fbfb..f782dcef 100644 --- a/libsoup/server/http2/soup-server-message-io-http2.c +++ b/libsoup/server/http2/soup-server-message-io-http2.c @@ -364,12 +364,18 @@ io_write_ready (GObject *stream, return G_SOURCE_CONTINUE; } - if (error && soup_server_connection_get_io_data (conn) == (SoupServerMessageIO *)io) - h2_debug (io, NULL, "[SESSION] IO error: %s", error->message); + if (soup_server_connection_get_io_data (conn) == (SoupServerMessageIO *)io) { + if (error) + h2_debug (io, NULL, "[SESSION] IO error: %s", error->message); + + g_clear_pointer (&io->write_source, g_source_unref); + + if (error || (!nghttp2_session_want_read (io->session) && !nghttp2_session_want_write (io->session))) + soup_server_connection_disconnect (conn); + } g_clear_error (&error); g_object_unref (conn); - g_clear_pointer (&io->write_source, g_source_unref); return G_SOURCE_REMOVE; } @@ -388,16 +394,21 @@ io_try_write (SoupServerMessageIOHTTP2 *io) while (!error && soup_server_connection_get_io_data (conn) == (SoupServerMessageIO *)io && !io->in_callback && nghttp2_session_want_write (io->session)) io_write (io, &error); - if (io->in_callback || g_error_matches (error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) { - g_clear_error (&error); - io->write_source = g_pollable_output_stream_create_source (G_POLLABLE_OUTPUT_STREAM (io->ostream), NULL); - g_source_set_name (io->write_source, "Soup server HTTP/2 write source"); - g_source_set_callback (io->write_source, (GSourceFunc)io_write_ready, io, NULL); - g_source_attach (io->write_source, g_main_context_get_thread_default ()); - } + if (soup_server_connection_get_io_data (conn) == (SoupServerMessageIO *)io) { + if (io->in_callback || g_error_matches (error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) { + g_clear_error (&error); + io->write_source = g_pollable_output_stream_create_source (G_POLLABLE_OUTPUT_STREAM (io->ostream), NULL); + g_source_set_name (io->write_source, "S oup server HTTP/2 write source"); + g_source_set_callback (io->write_source, (GSourceFunc)io_write_ready, io, NULL); + g_source_attach (io->write_source, g_main_context_get_thread_default ()); + } - if (error && soup_server_connection_get_io_data (conn) == (SoupServerMessageIO *)io) - h2_debug (io, NULL, "[SESSION] IO error: %s", error->message); + if (error) + h2_debug (io, NULL, "[SESSION] IO error: %s", error->message); + + if (error || (!nghttp2_session_want_read (io->session) && !nghttp2_session_want_write (io->session))) + soup_server_connection_disconnect (conn); + } g_clear_error (&error); g_object_unref (conn); @@ -450,8 +461,13 @@ io_read_ready (GObject *stream, return G_SOURCE_CONTINUE; } - if (error && soup_server_connection_get_io_data (conn) == (SoupServerMessageIO *)io) - h2_debug (io, NULL, "[SESSION] IO error: %s", error->message); + if (soup_server_connection_get_io_data (conn) == (SoupServerMessageIO *)io) { + if (error) + h2_debug (io, NULL, "[SESSION] IO error: %s", error->message); + + if (error || (!nghttp2_session_want_read (io->session) && !nghttp2_session_want_write (io->session))) + soup_server_connection_disconnect (conn); + } g_clear_error (&error); g_object_unref (conn); |