Skip to content

Commit

Permalink
mod_http2: work on .well-known/h2Interop/state
Browse files Browse the repository at this point in the history
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1754414 13f79535-47bb-0310-9956-ffa450edef68
  • Loading branch information
icing committed Jul 28, 2016
1 parent adc8879 commit c26b8c3
Showing 1 changed file with 87 additions and 48 deletions.
135 changes: 87 additions & 48 deletions modules/http2/h2_filter.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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;
}
Expand All @@ -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;
Expand Down

0 comments on commit c26b8c3

Please sign in to comment.