summaryrefslogtreecommitdiff
path: root/libsoup
diff options
context:
space:
mode:
authorCarlos Garcia Campos <cgarcia@igalia.com>2022-11-10 12:50:19 +0100
committerCarlos Garcia Campos <cgarcia@igalia.com>2022-11-10 12:50:19 +0100
commitab3767f07a075c9e1e847ac45559924eed9b4a3e (patch)
tree78b337fe847ab522f11df235bff9fe492b94865b /libsoup
parentd20c6601664624116f3dc43f21c7ec4a186cf8d3 (diff)
downloadlibsoup-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.c44
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);