[libsoup/wip/http2] fixup! Add initial HTTP2 backend
- From: Patrick Griffis <pgriffis src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libsoup/wip/http2] fixup! Add initial HTTP2 backend
- Date: Fri, 14 May 2021 18:39:01 +0000 (UTC)
commit 145f2a203c5f1947adcc328c8cb45a5a880150a1
Author: Patrick Griffis <pgriffis igalia com>
Date: Fri May 14 13:38:57 2021 -0500
fixup! Add initial HTTP2 backend
libsoup/http2/soup-client-message-io-http2.c | 86 +++++++++++++++++-----------
1 file changed, 53 insertions(+), 33 deletions(-)
---
diff --git a/libsoup/http2/soup-client-message-io-http2.c b/libsoup/http2/soup-client-message-io-http2.c
index 91e10d13..d2d653b5 100644
--- a/libsoup/http2/soup-client-message-io-http2.c
+++ b/libsoup/http2/soup-client-message-io-http2.c
@@ -151,10 +151,38 @@ frame_type_to_string (nghttp2_frame_type type)
}
}
+static const char *
+state_to_string (SoupHTTP2IOState state)
+{
+ switch (state) {
+ case STATE_NONE:
+ return "NONE";
+ case STATE_WRITE_HEADERS:
+ return "WRITE_HEADERS";
+ case STATE_WRITE_DATA:
+ return "WRITE_DATA";
+ case STATE_WRITE_DONE:
+ return "WRITE_DONE";
+ case STATE_READ_HEADERS:
+ return "READ_HEADERS";
+ case STATE_READ_DATA:
+ return "REA_DATA";
+ case STATE_READ_DATA_SNIFFED:
+ return "READ_DATA_SNIFFED";
+ case STATE_READ_DONE:
+ return "READ_DONE";
+ case STATE_ERROR:
+ return "ERROR";
+ default:
+ g_assert_not_reached ();
+ return "";
+ }
+}
+
static void
h2_debug (SoupClientMessageIOHTTP2 *io,
- SoupHTTP2MessageData *data,
- const char *format,
+ SoupHTTP2MessageData *data,
+ const char *format,
...)
{
va_list args;
@@ -194,7 +222,8 @@ set_error_for_data (SoupClientMessageIOHTTP2 *io,
SoupHTTP2MessageData *data,
GError *error)
{
- g_debug ("set_error_for_data: %s", error->message);
+ h2_debug (io, data, "[SESSION] Error: %s", error->message);
+ data->state = STATE_ERROR;
g_hash_table_replace (io->message_errors, data, error);
}
@@ -223,7 +252,8 @@ advance_state_from (SoupHTTP2MessageData *data,
return;
}
- h2_debug (data->io, data, "STATE %d -> %d", data->state, to);
+ h2_debug (data->io, data, "[SESSION] State %s -> %s",
+ state_to_string (data->state), state_to_string (to));
data->state = to;
}
@@ -251,7 +281,7 @@ on_header_callback (nghttp2_session *session,
soup_message_set_status (msg, status_code, NULL);
return 0;
}
- g_debug ("%s = %s", name, value);
+ g_debug ("Unknown header: %s = %s", name, value);
return 0;
}
@@ -296,12 +326,12 @@ on_begin_frame_callback (nghttp2_session *session,
switch (hd->type) {
case NGHTTP2_HEADERS:
if (data->state < STATE_READ_HEADERS)
- data->state = STATE_READ_HEADERS;
+ advance_state_from (data, STATE_ANY, STATE_READ_HEADERS);
break;
case NGHTTP2_DATA: {
- /* We may have sniffed a previous DATA frame */
if (data->state < STATE_READ_DATA)
- data->state = STATE_READ_DATA;
+ advance_state_from (data, STATE_ANY, STATE_READ_DATA);
+
if (!data->body_istream) {
data->body_istream = soup_body_input_stream_http2_new (G_POLLABLE_INPUT_STREAM
(data->io->istream));
g_signal_connect (data->body_istream, "need-more-data",
@@ -331,8 +361,6 @@ handle_goaway (SoupClientMessageIOHTTP2 *io,
* existing messages can be handled otherwise it is a fatal error */
if ((error_code == 0 && data->stream_id > last_stream_id) ||
data->state < STATE_READ_DONE) {
- h2_debug (io, data, "[GOAWAY] Error: %s", nghttp2_http2_strerror (error_code));
- data->state = STATE_ERROR;
/* TODO: We can restart unfinished messages */
set_error_for_data (io, data, g_error_new (G_IO_ERROR, G_IO_ERROR_FAILED,
"HTTP/2 Error: %s", nghttp2_http2_strerror (error_code)));
@@ -386,11 +414,9 @@ on_frame_recv_callback (nghttp2_session *session,
data->metrics->response_body_bytes_received += frame->data.hd.length +
FRAME_HEADER_SIZE;
break;
case NGHTTP2_RST_STREAM:
- h2_debug (io, data, "[RST_STREAM] %s", nghttp2_http2_strerror
(frame->rst_stream.error_code));
if (frame->rst_stream.error_code != NGHTTP2_NO_ERROR) {
set_error_for_data (io, data, g_error_new_literal (G_IO_ERROR, G_IO_ERROR_FAILED,
nghttp2_http2_strerror
(frame->rst_stream.error_code)));
- data->state = STATE_ERROR;
}
break;
};
@@ -551,7 +577,8 @@ on_stream_close_callback (nghttp2_session *session,
uint32_t error_code,
void *user_data)
{
- g_debug ("[%d] Stream Closed: %s", stream_id, nghttp2_http2_strerror (error_code));
+ SoupHTTP2MessageData *data = nghttp2_session_get_stream_user_data (session, stream_id);
+ h2_debug (data->io, data, "[SESSION] Closed: %s", nghttp2_http2_strerror (error_code));
return 0;
}
@@ -576,7 +603,7 @@ on_data_read (GInputStream *source,
GError *error = NULL;
gssize read = g_input_stream_read_finish (source, res, &error);
- g_debug ("[SEND_BODY] Read %zu", read);
+ h2_debug (data->io, data, "[SEND_BODY] Read %zu", read);
/* This operation may have outlived the message data in which
case this will have been cancelled. */
@@ -593,7 +620,7 @@ on_data_read (GInputStream *source,
else
g_byte_array_set_size (data->data_source_buffer, read);
- g_debug ("[SEND_BODY] Resuming send");
+ h2_debug (data->io, data, "[SEND_BODY] Resuming send");
nghttp2_session_resume_data (data->io->session, data->stream_id);
}
@@ -624,7 +651,7 @@ on_data_source_read_callback (nghttp2_session *session,
SoupClientMessageIOHTTP2 *io = get_io_data (data->msg);
if (data->paused) {
- g_debug ("[SEND_BODY] Paused");
+ h2_debug (io, data, "[SEND_BODY] Paused");
return NGHTTP2_ERR_PAUSE;
}
@@ -644,7 +671,7 @@ on_data_source_read_callback (nghttp2_session *session,
gssize read = g_pollable_input_stream_read_nonblocking (in_stream, buf, length,
data->cancellable, &error);
if (read) {
- g_debug ("[SEND_BODY] Read %zu", read);
+ h2_debug (io, data, "[SEND_BODY] Read %zu", read);
log_request_data (data, buf, read);
}
@@ -652,7 +679,7 @@ on_data_source_read_callback (nghttp2_session *session,
if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) {
g_assert (data->data_source_poll == NULL);
- g_debug ("[SEND_BODY] Polling");
+ h2_debug (io, data, "[SEND_BODY] Polling");
data->data_source_poll = g_pollable_input_stream_create_source (in_stream,
data->data_source_cancellable);
g_source_set_callback (data->data_source_poll,
(GSourceFunc)on_data_readable, data, NULL);
g_source_set_priority (data->data_source_poll, get_data_io_priority (data));
@@ -662,13 +689,11 @@ on_data_source_read_callback (nghttp2_session *session,
return NGHTTP2_ERR_DEFERRED;
}
- g_debug ("[SEND_BODY] Error %s", error->message);
set_error_for_data (io, data, g_steal_pointer (&error));
- data->state = STATE_ERROR;
return NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE;
}
else if (read == 0) {
- g_debug ("[SEND_BODY] EOF");
+ h2_debug (io, data, "[SEND_BODY] EOF");
*data_flags |= NGHTTP2_DATA_FLAG_EOF;
}
@@ -685,25 +710,23 @@ on_data_source_read_callback (nghttp2_session *session,
gsize buffer_len = data->data_source_buffer->len;
if (buffer_len) {
- g_debug ("[SEND_BODY] Sending %zu", buffer_len);
+ h2_debug (io, data, "[SEND_BODY] Sending %zu", buffer_len);
g_assert (buffer_len <= length); /* QUESTION: Maybe not reliable */
memcpy (buf, data->data_source_buffer->data, buffer_len);
log_request_data (data, buf, buffer_len);
g_byte_array_set_size (data->data_source_buffer, 0);
return buffer_len;
} else if (data->data_source_eof) {
- g_debug ("[SEND_BODY] EOF");
+ h2_debug (io, data, "[SEND_BODY] EOF");
g_clear_object (&data->data_source_cancellable);
*data_flags |= NGHTTP2_DATA_FLAG_EOF;
return 0;
} else if (data->data_source_error) {
- g_debug ("[SEND_BODY] Error %s", data->data_source_error->message);
g_clear_object (&data->data_source_cancellable);
set_error_for_data (io, data, g_steal_pointer (&data->data_source_error));
- data->state = STATE_ERROR;
return NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE;
} else {
- g_debug ("[SEND_BODY] Reading async");
+ h2_debug (io, data, "[SEND_BODY] Reading async");
g_byte_array_set_size (data->data_source_buffer, length);
g_input_stream_read_async (in_stream, data->data_source_buffer->data, length,
get_data_io_priority (data),
@@ -914,7 +937,7 @@ soup_client_message_io_http2_pause (SoupClientMessageIO *iface,
SoupClientMessageIOHTTP2 *io = (SoupClientMessageIOHTTP2 *)iface;
SoupHTTP2MessageData *data = get_data_for_message (io, msg);
- g_debug ("soup_client_message_io_http2_pause");
+ h2_debug (io, data, "[SESSION] Paused");
if (data->paused)
g_warn_if_reached ();
@@ -929,7 +952,7 @@ soup_client_message_io_http2_unpause (SoupClientMessageIO *iface,
SoupClientMessageIOHTTP2 *io = (SoupClientMessageIOHTTP2 *)iface;
SoupHTTP2MessageData *data = get_data_for_message (io, msg);
- g_debug ("soup_client_message_io_http2_unpause");
+ h2_debug (io, data, "[SESSION] Unpaused");
if (!data->paused)
g_warn_if_reached ();
@@ -1025,8 +1048,7 @@ client_stream_eof (SoupClientInputStream *stream,
}
SoupHTTP2MessageData *data = get_data_for_message (io, msg);
- if (data->state < STATE_READ_DONE)
- data->state = STATE_READ_DONE;
+ advance_state_from (data, STATE_ANY, STATE_READ_DONE);
}
static GInputStream *
@@ -1038,7 +1060,7 @@ soup_client_message_io_http2_get_response_istream (SoupClientMessageIO *iface,
SoupHTTP2MessageData *data = get_data_for_message (io, msg);
GInputStream *client_stream, *base_stream;
- g_debug ("soup_client_message_io_http2_get_response_istream paused=%d", data->paused);
+ g_message ("soup_client_message_io_http2_get_response_istream: %p", get_error_for_data (io, data));
if (data->decoded_data_istream)
base_stream = g_object_ref (data->decoded_data_istream);
@@ -1297,8 +1319,6 @@ soup_client_message_io_http2_destroy (SoupClientMessageIO *iface)
{
SoupClientMessageIOHTTP2 *io = (SoupClientMessageIOHTTP2 *)iface;
- g_debug ("soup_client_message_io_http2_destroy");
-
g_clear_object (&io->stream);
g_clear_pointer (&io->async_context, g_main_context_unref);
g_clear_pointer (&io->session, nghttp2_session_del);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]