From: Stefan Eissing Date: Thu, 28 Jul 2016 14:02:10 +0000 (+0000) Subject: mod_http2: work on .well-known/h2Interop/state X-Git-Tag: 2.5.0-alpha~1367 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c5d67f1957153852ed1f10636d132b0a61ca3b59;p=thirdparty%2Fapache%2Fhttpd.git mod_http2: work on .well-known/h2Interop/state git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1754414 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/http2/h2_filter.c b/modules/http2/h2_filter.c index 33189de0164..a48ae2e3078 100644 --- a/modules/http2/h2_filter.c +++ b/modules/http2/h2_filter.c @@ -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_brigade *bb, const char *fmt, ...) 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_filter(h2_stream *stream) 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;