MINOR: stats: report HTTP compression stats per frontend and per backend

It was a bit frustrating to have no idea about the bandwidth saved by
HTTP compression. Now we have per-frontend and per-backend stats. The
stats on the HTTP interface are shown in a hover title in the "bytes out"
column if at least something was fed to the compressor. 3 new columns
appeared in the CSV stats output.
diff --git a/src/compression.c b/src/compression.c
index 0459aa3..3622d40 100644
--- a/src/compression.c
+++ b/src/compression.c
@@ -217,7 +217,7 @@
  */
 int http_compression_buffer_end(struct session *s, struct buffer **in, struct buffer **out, int end)
 {
-	int to_forward;
+	int to_forward, forwarded;
 	int left;
 	struct http_msg *msg = &s->txn.rsp;
 	struct buffer *ib = *in, *ob = *out;
@@ -262,9 +262,17 @@
 	}
 
 	to_forward = ob->i;
+
 	/* update input rate */
-	if (s->comp_ctx && s->comp_ctx->cur_lvl > 0)
-		update_freq_ctr(&global.comp_bps_in, ib->o - ob->o);
+	forwarded = ib->o - ob->o;
+	if (s->comp_ctx && s->comp_ctx->cur_lvl > 0) {
+		update_freq_ctr(&global.comp_bps_in, forwarded);
+		s->fe->fe_counters.comp_in += forwarded;
+		s->be->be_counters.comp_in += forwarded;
+	} else {
+		s->fe->fe_counters.comp_byp += forwarded;
+		s->be->be_counters.comp_byp += forwarded;
+	}
 
 	/* copy the remaining data in the tmp buffer. */
 	if (ib->i > 0) {
@@ -281,8 +289,11 @@
 	*in = ob;
 	*out = ib;
 
-	if (s->comp_ctx && s->comp_ctx->cur_lvl > 0)
+	if (s->comp_ctx && s->comp_ctx->cur_lvl > 0) {
 		update_freq_ctr(&global.comp_bps_out, to_forward);
+		s->fe->fe_counters.comp_out += to_forward;
+		s->be->be_counters.comp_out += to_forward;
+	}
 
 	/* forward the new chunk without remaining data */
 	b_adv(ob, to_forward);
diff --git a/src/dumpstats.c b/src/dumpstats.c
index 997bdec..a9ecdb3 100644
--- a/src/dumpstats.c
+++ b/src/dumpstats.c
@@ -379,6 +379,7 @@
 			    "hrsp_1xx,hrsp_2xx,hrsp_3xx,hrsp_4xx,hrsp_5xx,hrsp_other,hanafail,"
 			    "req_rate,req_rate_max,req_tot,"
 			    "cli_abrt,srv_abrt,"
+			     "comp_in, comp_out, comp_byp,"
 			    "\n");
 }
 
@@ -2477,15 +2478,27 @@
 				chunk_appendf(&trash,
 				     /* sessions: total, lbtot */
 				     ">%s%s%s</td><td></td>"
-				     /* bytes : in, out */
-				     "<td>%s</td><td>%s</td>"
+				     /* bytes : in */
+				     "<td>%s</td><td"
 				     "",
 				     (px->mode == PR_MODE_HTTP)?"<u>":"",
 				     U2H6(px->fe_counters.cum_sess),
 				     (px->mode == PR_MODE_HTTP)?"</u>":"",
-				     U2H7(px->fe_counters.bytes_in), U2H8(px->fe_counters.bytes_out));
+				     U2H7(px->fe_counters.bytes_in));
+
+				/* compression stats (via td title): comp_in, comp_out, comp_byp */
+				chunk_appendf(&trash, " title=\"compression: in=%lld out=%lld bypassed=%lld\"",
+				     px->fe_counters.comp_in, px->fe_counters.comp_out, px->fe_counters.comp_byp);
 
 				chunk_appendf(&trash,
+				     /* bytes: out */
+				     ">%s%s%s</td>"
+				     "",
+				     (px->fe_counters.comp_in || px->fe_counters.comp_byp) ? "<u>":"",
+				     U2H0(px->fe_counters.bytes_out),
+				     (px->fe_counters.comp_in || px->fe_counters.comp_byp) ? "</u>":"");
+
+				chunk_appendf(&trash,
 				     /* denied: req, resp */
 				     "<td>%s</td><td>%s</td>"
 				     /* errors : request, connect, response */
@@ -2559,6 +2572,10 @@
 				/* errors: cli_aborts, srv_aborts */
 				chunk_appendf(&trash, ",,");
 
+				/* compression: in, out, bypassed */
+				chunk_appendf(&trash, "%lld,%lld,%lld,",
+			              px->fe_counters.comp_in, px->fe_counters.comp_out, px->fe_counters.comp_byp);
+
 				/* finish with EOL */
 				chunk_appendf(&trash, "\n");
 			}
@@ -3186,16 +3203,28 @@
 				chunk_appendf(&trash,
 				     /* sessions: total, lbtot */
 				     ">%s%s%s</td><td>%s</td>"
-				     /* bytes: in, out */
-				     "<td>%s</td><td>%s</td>"
+				     /* bytes: in */
+				     "<td>%s</td><td"
 				     "",
 				     (px->mode == PR_MODE_HTTP)?"<u>":"",
 				     U2H6(px->be_counters.cum_conn),
 				     (px->mode == PR_MODE_HTTP)?"</u>":"",
 				     U2H7(px->be_counters.cum_lbconn),
-				     U2H8(px->be_counters.bytes_in), U2H9(px->be_counters.bytes_out));
+				     U2H8(px->be_counters.bytes_in));
+
+				/* compression stats (via td title): comp_in, comp_out, comp_byp */
+				chunk_appendf(&trash, " title=\"compression: in=%lld out=%lld bypassed=%lld\"",
+				     px->be_counters.comp_in, px->be_counters.comp_out, px->be_counters.comp_byp);
 
 				chunk_appendf(&trash,
+				     /* bytes: out */
+				     ">%s%s%s</td>"
+				     "",
+				     (px->be_counters.comp_in || px->be_counters.comp_byp) ? "<u>":"",
+				     U2H0(px->be_counters.bytes_out),
+				     (px->be_counters.comp_in || px->be_counters.comp_byp) ? "</u>":"");
+
+				chunk_appendf(&trash,
 				     /* denied: req, resp */
 				     "<td>%s</td><td>%s</td>"
 				     /* errors : request, connect */
@@ -3300,6 +3329,10 @@
 				chunk_appendf(&trash, "%lld,%lld,",
 					     px->be_counters.cli_aborts, px->be_counters.srv_aborts);
 
+				/* compression: in, out, bypassed */
+				chunk_appendf(&trash, "%lld,%lld,%lld,",
+			              px->be_counters.comp_in, px->be_counters.comp_out, px->be_counters.comp_byp);
+
 				/* finish with EOL */
 				chunk_appendf(&trash, "\n");