]> git.kaiwu.me - haproxy.git/commitdiff
MINOR: tcp-sample: permit retrieving tcp_info from the connection/session stage
authorWilly Tarreau <w@1wt.eu>
Sun, 11 Jan 2026 14:19:18 +0000 (15:19 +0100)
committerWilly Tarreau <w@1wt.eu>
Sun, 11 Jan 2026 14:48:20 +0000 (15:48 +0100)
The fc_xxx info that are retrieved over tcp_info could currently not
be accessed before a stream is created due to a test that verified the
existence of a stream. The rationale here was that the function works
both for frontend and backend. Let's always retrieve these info from
the session for the frontend case so that it now becomes possible to
set variables at connection/session time. The doc did not mention this
limitation so this could almost be considered as a bug.

src/tcp_sample.c

index 1d414ae4b1732225fcb0e8fbc7b05d50c5c7668c..64725ef88604322a627677617a57471ec1679aa3 100644 (file)
@@ -323,21 +323,20 @@ static inline int get_tcp_info(const struct arg *args, struct sample *smp,
 {
        struct connection *conn;
 
-       /* strm can be null. */
-       if (!smp->strm)
-               return 0;
-
        smp->data.type = SMP_T_SINT;
-       /* get the object associated with the stream connector.The
-        * object can be other thing than a connection. For example,
-        * it could be an appctx.
+
+       /* The front connection may be obtained either via the stream or the
+        * session. Since the session is always there, we use it. Note that
+        * the origin is not necessarily a connection (e.g. appctx). The back
+        * connection however only works with a stream, so we check both.
         */
-       conn = (dir == 0 ? sc_conn(smp->strm->scf) : sc_conn(smp->strm->scb));
+       conn = dir == 0 ?
+               objt_conn(smp->sess->origin) :
+               smp->strm ? sc_conn(smp->strm->scb) : NULL;
        if (!conn || !conn->ctrl->get_info ||
            !conn->ctrl->get_info(conn, &smp->data.u.sint, val))
                return 0;
 
-
        return 1;
 }