BUG/MINOR: connection: Fix fc_http_major and bc_http_major for TCP connections

fc_http_major and bc_http_major sample fetches return the major digit of the
HTTP version used, respectively, by the frontend and the backend
connections, based on the mux. However, in reality, "2" is returned if the
H2 mux is detected, otherwise "1" is inconditionally returned, regardless
the mux used. Thus, if called for a raw TCP connection, "1" is returned.

To fix this bug, we now get the multiplexer flags, if there is one, to be
sure MX_FL_HTX is set.

I guess it was made this way on purpose when the H2 multiplexer was
introduced in the 1.8 and with the legacy HTTP mode there is no other
solution at the connection level. Thus this patch should be backported as
far as 2.2. For the 2.0, it must be evaluated first because of the legacy
HTTP mode.

(cherry picked from commit f4dd9ae5c7ca65cd5c2652343e4af5ca7a97ab32)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
diff --git a/src/connection.c b/src/connection.c
index 366bb25..bedcc94 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -1570,6 +1570,8 @@
 
 /* return the major HTTP version as 1 or 2 depending on how the request arrived
  * before being processed.
+ *
+ * WARNING: Should be updated if a new major HTTP version is added.
  */
 static int
 smp_fetch_fc_http_major(const struct arg *args, struct sample *smp, const char *kw, void *private)
@@ -1577,8 +1579,18 @@
 	struct connection *conn = (kw[0] != 'b') ? objt_conn(smp->sess->origin) :
 										smp->strm ? cs_conn(objt_cs(smp->strm->si[1].end)) : NULL;
 
+	/* No connection or a connection with a RAW muxx */
+	if (!conn || (conn->mux && !(conn->mux->flags & MX_FL_HTX)))
+		return 0;
+
+	/* No mux install, this may change */
+	if (!conn->mux) {
+		smp->flags |= SMP_F_MAY_CHANGE;
+		return 0;
+	}
+
 	smp->data.type = SMP_T_SINT;
-	smp->data.u.sint = (conn && strcmp(conn_get_mux_name(conn), "H2") == 0) ? 2 : 1;
+	smp->data.u.sint = (strcmp(conn_get_mux_name(conn), "H2") == 0) ? 2 : 1;
 	return 1;
 }