summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garcia Campos <cgarcia@igalia.com>2021-11-10 12:34:52 +0100
committerPatrick Griffis <pgriffis@igalia.com>2021-11-11 15:19:52 +0000
commit6f7d0c8b9e66461e6e6255255272150b355f8fab (patch)
tree56d72c4de0f821ee51899a858e35fb75e8255188
parentc7e251644c618ce5193881b2a16374ababc2ccf8 (diff)
downloadlibsoup-6f7d0c8b9e66461e6e6255255272150b355f8fab.tar.gz
http2: ensure we always do blocking writes for sync requests
-rw-r--r--libsoup/http2/soup-client-message-io-http2.c23
1 files changed, 12 insertions, 11 deletions
diff --git a/libsoup/http2/soup-client-message-io-http2.c b/libsoup/http2/soup-client-message-io-http2.c
index e66a72cc..86bf3b24 100644
--- a/libsoup/http2/soup-client-message-io-http2.c
+++ b/libsoup/http2/soup-client-message-io-http2.c
@@ -392,7 +392,8 @@ io_write_ready (GObject *stream,
}
static void
-io_try_write (SoupClientMessageIOHTTP2 *io)
+io_try_write (SoupClientMessageIOHTTP2 *io,
+ gboolean blocking)
{
GError *error = NULL;
@@ -400,7 +401,7 @@ io_try_write (SoupClientMessageIOHTTP2 *io)
return;
while (nghttp2_session_want_write (io->session) && !error)
- io_write (io, FALSE, NULL, &error);
+ io_write (io, blocking, NULL, &error);
if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) {
g_clear_error (&error);
@@ -514,7 +515,7 @@ soup_client_message_io_http2_terminate_session (SoupClientMessageIOHTTP2 *io)
io->session_terminated = TRUE;
NGCHECK (nghttp2_session_terminate_session (io->session, NGHTTP2_NO_ERROR));
- io_try_write (io);
+ io_try_write (io, FALSE);
}
/* HTTP2 read callbacks */
@@ -708,7 +709,7 @@ on_frame_recv_callback (nghttp2_session *session,
h2_debug (io, data, "[RECV] WINDOW_UPDATE: increment=%d, total=%d", frame->window_update.window_size_increment,
nghttp2_session_get_stream_remote_window_size (session, frame->hd.stream_id));
if (nghttp2_session_get_stream_remote_window_size (session, frame->hd.stream_id) > 0)
- io_try_write (io);
+ io_try_write (io, !data->item->async);
break;
};
@@ -872,7 +873,7 @@ on_data_readable (GInputStream *stream,
h2_debug (data->io, data, "on data readable");
NGCHECK (nghttp2_session_resume_data (data->io->session, data->stream_id));
- io_try_write (data->io);
+ io_try_write (data->io, !data->item->async);
g_clear_pointer (&data->data_source_poll, g_source_unref);
return G_SOURCE_REMOVE;
@@ -907,7 +908,7 @@ on_data_read (GInputStream *source,
h2_debug (data->io, data, "[SEND_BODY] Resuming send");
NGCHECK (nghttp2_session_resume_data (data->io->session, data->stream_id));
- io_try_write (data->io);
+ io_try_write (data->io, !data->item->async);
}
static void
@@ -1043,7 +1044,7 @@ message_priority_changed (SoupHTTP2MessageData *data)
nghttp2_priority_spec_init (&priority_spec, 0, weight, 0);
NGCHECK (nghttp2_submit_priority (data->io->session, NGHTTP2_FLAG_NONE, data->stream_id, &priority_spec));
- io_try_write (data->io);
+ io_try_write (data->io, !data->item->async);
}
static SoupHTTP2MessageData *
@@ -1218,7 +1219,7 @@ send_message_request (SoupMessage *msg,
NGCHECK (stream_id);
data->stream_id = stream_id;
h2_debug (io, data, "[SESSION] Request made for %s%s", authority_header, path_and_query);
- io_try_write (io);
+ io_try_write (io, !data->item->async);
}
g_array_free (headers, TRUE);
g_free (authority);
@@ -1292,7 +1293,7 @@ soup_client_message_io_http2_finished (SoupClientMessageIO *iface,
return;
}
- io_try_write (io);
+ io_try_write (io, FALSE);
}
static void
@@ -1531,7 +1532,7 @@ soup_client_message_io_http2_skip (SoupClientMessageIO *iface,
h2_debug (io, data, "Skip");
NGCHECK (nghttp2_submit_rst_stream (io->session, NGHTTP2_FLAG_NONE, data->stream_id, NGHTTP2_STREAM_CLOSED));
- io_try_write (io);
+ io_try_write (io, blocking);
return TRUE;
}
@@ -1701,7 +1702,7 @@ soup_client_message_io_http2_new (SoupConnection *conn)
{ NGHTTP2_SETTINGS_ENABLE_PUSH, 0 },
};
NGCHECK (nghttp2_submit_settings (io->session, NGHTTP2_FLAG_NONE, settings, G_N_ELEMENTS (settings)));
- io_try_write (io);
+ io_try_write (io, FALSE);
return (SoupClientMessageIO *)io;
}