You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by ic...@apache.org on 2016/07/28 14:02:10 UTC

svn commit: r1754414 - /httpd/httpd/trunk/modules/http2/h2_filter.c

Author: icing
Date: Thu Jul 28 14:02:10 2016
New Revision: 1754414

URL: http://svn.apache.org/viewvc?rev=1754414&view=rev
Log:
mod_http2: work on .well-known/h2Interop/state

Modified:
    httpd/httpd/trunk/modules/http2/h2_filter.c

Modified: httpd/httpd/trunk/modules/http2/h2_filter.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/h2_filter.c?rev=1754414&r1=1754413&r2=1754414&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/http2/h2_filter.c (original)
+++ httpd/httpd/trunk/modules/http2/h2_filter.c Thu Jul 28 14:02:10 2016
@@ -23,6 +23,7 @@
 
 #include "h2_private.h"
 #include "h2.h"
+#include "h2_config.h"
 #include "h2_conn_io.h"
 #include "h2_ctx.h"
 #include "h2_mplx.h"
@@ -209,15 +210,83 @@ static apr_status_t bbout(apr_bucket_bri
     return rv;
 }
 
-static apr_status_t h2_status_stream_filter(h2_stream *stream)
+static void add_settings(apr_bucket_brigade *bb, h2_session *s, int last) 
+{
+    h2_mplx *m = s->mplx;
+    
+    bbout(bb, "  \"settings\": {\n");
+    bbout(bb, "    \"SETTINGS_MAX_CONCURRENT_STREAMS\": %d,\n", m->max_streams); 
+    bbout(bb, "    \"SETTINGS_MAX_FRAME_SIZE\": %d,\n", 16*1024); 
+    bbout(bb, "    \"SETTINGS_INITIAL_WINDOW_SIZE\": %d,\n",
+          h2_config_geti(s->config, H2_CONF_WIN_SIZE));
+    bbout(bb, "    \"SETTINGS_ENABLE_PUSH\": %d\n", h2_session_push_enabled(s)); 
+    bbout(bb, "  }%s\n", last? "" : ",");
+}
+
+static void add_push(apr_bucket_brigade *bb, h2_session *s, 
+                     h2_stream *stream, int last) 
 {
-    h2_session *session = stream->session;
-    h2_mplx *mplx = session->mplx;
-    conn_rec *c = session->c;
     h2_push_diary *diary;
-    apr_bucket_brigade *bb;
     apr_status_t status;
     
+    bbout(bb, "  \"push\": {\n");
+    diary = s->push_diary;
+    if (diary) {
+        const char *data;
+        const char *base64_digest;
+        apr_size_t len;
+        
+        status = h2_push_diary_digest_get(diary, bb->p, 256, 
+                                          stream->request->authority, 
+                                          &data, &len);
+        if (status == APR_SUCCESS) {
+            base64_digest = h2_util_base64url_encode(data, len, bb->p);
+            bbout(bb, "    \"cacheDigest\": \"%s\",\n", base64_digest);
+        }
+    }
+    bbout(bb, "    \"promises\": %d,\n", s->pushes_promised);
+    bbout(bb, "    \"submits\": %d,\n", s->pushes_submitted);
+    bbout(bb, "    \"resets\": %d\n", s->pushes_reset);
+    bbout(bb, "  }%s\n", last? "" : ",");
+}
+
+static void add_in(apr_bucket_brigade *bb, h2_session *s, int last) 
+{
+    bbout(bb, "  \"in\": {\n");
+    bbout(bb, "    \"requests\": %d,\n", s->remote.emitted_count);
+    bbout(bb, "    \"resets\": %d, \n", s->streams_reset);
+    bbout(bb, "    \"frames\": %ld,\n", (long)s->frames_received);
+    bbout(bb, "    \"octets\": %"APR_UINT64_T_FMT"\n", s->io.bytes_read);
+    bbout(bb, "  }%s\n", last? "" : ",");
+}
+
+static void add_out(apr_bucket_brigade *bb, h2_session *s, int last) 
+{
+    bbout(bb, "  \"out\": {\n");
+    bbout(bb, "    \"responses\": %d,\n", s->responses_submitted);
+    bbout(bb, "    \"frames\": %ld,\n", (long)s->frames_sent);
+    bbout(bb, "    \"octets\": %"APR_UINT64_T_FMT"\n", s->io.bytes_written);
+    bbout(bb, "  }%s\n", last? "" : ",");
+}
+
+/*
+int32_t nghttp2_session_get_effective_local_window_size(session);
+int32_t
+nghttp2_session_get_stream_effective_local_window_size(nghttp2_session *session,
+                                                       int32_t stream_id);
+                                                       int32_t
+nghttp2_session_get_stream_remote_window_size(nghttp2_session *session,
+                                              int32_t stream_id);
+int32_t
+nghttp2_session_get_remote_window_size(nghttp2_session *session);
+
+*/
+static apr_status_t h2_status_stream_filter(h2_stream *stream)
+{
+    h2_session *s = stream->session;
+    conn_rec *c = s->c;
+    apr_bucket_brigade *bb;
+    
     if (!stream->response) {
         return APR_EINVAL;
     }
@@ -231,49 +300,19 @@ static apr_status_t h2_status_stream_fil
     stream->response->content_length = -1;
     
     bbout(bb, "{\n");
-    bbout(bb, "  \"HTTP2\": \"on\",\n");
-    bbout(bb, "  \"H2PUSH\": \"%s\",\n", h2_session_push_enabled(session)? "on" : "off");
-    bbout(bb, "  \"mod_http2_version\": \"%s\",\n", MOD_HTTP2_VERSION);
-    bbout(bb, "  \"session_id\": %ld,\n", (long)session->id);
-    bbout(bb, "  \"streams_max\": %d,\n", (int)session->max_stream_count);
-    bbout(bb, "  \"this_stream\": %d,\n", stream->id);
-    bbout(bb, "  \"streams_open\": %d,\n", (int)h2_ihash_count(session->streams));
-    bbout(bb, "  \"max_stream_started\": %d,\n", mplx->max_stream_started);
-    bbout(bb, "  \"requests_received\": %d,\n", session->remote.emitted_count);
-    bbout(bb, "  \"responses_submitted\": %d,\n", session->responses_submitted);
-    bbout(bb, "  \"streams_reset\": %d, \n", session->streams_reset);
-    bbout(bb, "  \"pushes_promised\": %d,\n", session->pushes_promised);
-    bbout(bb, "  \"pushes_submitted\": %d,\n", session->pushes_submitted);
-    bbout(bb, "  \"pushes_reset\": %d,\n", session->pushes_reset);
-    
-    diary = session->push_diary;
-    if (diary) {
-        const char *data;
-        const char *base64_digest;
-        apr_size_t len;
-        
-        status = h2_push_diary_digest_get(diary, stream->pool, 256, 
-                                          stream->request->authority, &data, &len);
-        if (status == APR_SUCCESS) {
-            base64_digest = h2_util_base64url_encode(data, len, stream->pool);
-            bbout(bb, "  \"cache_digest\": \"%s\",\n", base64_digest);
-        }
-        
-        /* try the reverse for testing purposes */
-        status = h2_push_diary_digest_set(diary, stream->request->authority, data, len);
-        if (status == APR_SUCCESS) {
-            status = h2_push_diary_digest_get(diary, stream->pool, 256, 
-                                              stream->request->authority, &data, &len);
-            if (status == APR_SUCCESS) {
-                base64_digest = h2_util_base64url_encode(data, len, stream->pool);
-                bbout(bb, "  \"cache_digest^2\": \"%s\",\n", base64_digest);
-            }
-        }
-    }
-    bbout(bb, "  \"frames_received\": %ld,\n", (long)session->frames_received);
-    bbout(bb, "  \"frames_sent\": %ld,\n", (long)session->frames_sent);
-    bbout(bb, "  \"bytes_received\": %"APR_UINT64_T_FMT",\n", session->io.bytes_read);
-    bbout(bb, "  \"bytes_sent\": %"APR_UINT64_T_FMT"\n", session->io.bytes_written);
+    add_settings(bb, s, 0);
+    bbout(bb, "  \"connFlowIn\": %d,\n", 
+          nghttp2_session_get_effective_local_window_size(s->ngh2));
+    bbout(bb, "  \"connFlowOut\": %d,\n", 
+          nghttp2_session_get_remote_window_size(s->ngh2));
+    bbout(bb, "  \"sentGoAway\": %d,\n", 
+          (s->state == H2_SESSION_ST_LOCAL_SHUTDOWN
+           || s->state == H2_SESSION_ST_DONE));
+
+    add_in(bb, s, 0);
+    add_out(bb, s, 0);
+
+    add_push(bb, s, stream, 1);
     bbout(bb, "}\n");
     
     return APR_SUCCESS;