[libsoup/wip/http2] fixup! Add initial HTTP2 backend



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]