diff --git a/src/mux_h2.c b/src/mux_h2.c index 8b670df64..76c9b0805 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -521,6 +521,8 @@ struct task *h2_deferred_shut(struct task *t, void *ctx, unsigned int state); static struct h2s *h2c_bck_stream_new(struct h2c *h2c, struct stconn *sc, struct session *sess); static void h2s_alert(struct h2s *h2s); static inline void h2_remove_from_list(struct h2s *h2s); +static int h2_dump_h2c_info(struct buffer *msg, struct h2c *h2c, const char *pfx); +static int h2_dump_h2s_info(struct buffer *msg, const struct h2s *h2s, const char *pfx); /* returns the stconn associated to the H2 stream */ static forceinline struct stconn *h2s_sc(const struct h2s *h2s) @@ -4743,12 +4745,30 @@ static int h2_sctl(struct stconn *sc, enum mux_sctl_type mux_sctl, void *output) { int ret = 0; struct h2s *h2s = __sc_mux_strm(sc); + union mux_sctl_dbg_str_ctx *dbg_ctx; + struct buffer *buf; switch (mux_sctl) { case MUX_SCTL_SID: if (output) *((int64_t *)output) = h2s->id; return ret; + case MUX_SCTL_DBG_STR: + dbg_ctx = output; + buf = get_trash_chunk(); + + if (dbg_ctx->arg.debug_flags & MUX_SCTL_DBG_STR_L_MUXS) + h2_dump_h2s_info(buf, h2s, NULL); + + if (dbg_ctx->arg.debug_flags & MUX_SCTL_DBG_STR_L_MUXC) + h2_dump_h2c_info(buf, h2s->h2c, NULL); + + if (dbg_ctx->arg.debug_flags & MUX_SCTL_DBG_STR_L_CONN) + chunk_appendf(buf, " conn.flg=%#08x", h2s->h2c->conn->flags); + + /* other layers not implemented */ + dbg_ctx->ret.buf = *buf; + return ret; default: return -1;