]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: sample: Refactor fc_pp_authority by wrapping the generic TLV fetch
authorAlexander Stephan <alexander.stephan@sap.com>
Wed, 16 Aug 2023 14:18:33 +0000 (16:18 +0200)
committerWilly Tarreau <w@1wt.eu>
Tue, 29 Aug 2023 13:31:51 +0000 (15:31 +0200)
We already have a call that can retreive an TLV with any value.
Therefore, the fetch logic is redundant and can be simplified
by simply calling the generic fetch with the correct TLV ID
set as an argument.

include/haproxy/connection.h
src/connection.c

index e21d8294dbb68129484d1a7fba51e40d6a70a71f..fb14eed1258b74057f61a2835a85be895ba22c45 100644 (file)
@@ -729,6 +729,20 @@ static inline struct listener *conn_active_reverse_listener(const struct connect
                                    __objt_listener(conn->target);
 }
 
+/*
+ * Prepare TLV argument for redirecting fetches.
+ * Note that it is not possible to use an argument check function
+ * as that would require us to allow arguments for functions
+ * that do not need it. Alternatively, the sample logic could be
+ * adjusted to perform checks for no arguments and allocate
+ * in the check function. However, this does not seem worth the trouble.
+ */
+static inline void set_tlv_arg(int tlv_type, struct arg *tlv_arg)
+{
+       tlv_arg->type = ARGT_SINT;
+       tlv_arg->data.sint = tlv_type;
+}
+
 #endif /* _HAPROXY_CONNECTION_H */
 
 /*
index 5bcc4d032c3fab4f784831e0b279e433697fb8ad..82a9ef39adaac2dbe23d15fb70148fc9b2880181 100644 (file)
@@ -2328,33 +2328,13 @@ int smp_fetch_fc_pp_tlv(const struct arg *args, struct sample *smp, const char *
 /* fetch the authority TLV from a PROXY protocol header */
 int smp_fetch_fc_pp_authority(const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
-       struct connection *conn = NULL;
-       struct conn_tlv_list *conn_tlv = NULL;
-
-       conn = objt_conn(smp->sess->origin);
-       if (!conn)
-               return 0;
-
-       if (conn->flags & CO_FL_WAIT_XPRT) {
-               smp->flags |= SMP_F_MAY_CHANGE;
-               return 0;
-       }
-
-       conn_tlv = smp->ctx.p ? smp->ctx.p : LIST_ELEM(conn->tlv_list.n, struct conn_tlv_list *, list);
-       list_for_each_entry_from(conn_tlv, &conn->tlv_list, list) {
-               if (conn_tlv->type == PP2_TYPE_AUTHORITY) {
-                       smp->data.type = SMP_T_STR;
-                       smp->data.u.str.area = conn_tlv->value;
-                       smp->data.u.str.data = conn_tlv->len;
-                       smp->ctx.p = conn_tlv;
-
-                       return 1;
-               }
-       }
-
-       smp->flags &= ~SMP_F_NOT_LAST;
+       struct arg tlv_arg;
+       int ret;
 
-       return 0;
+       set_tlv_arg(PP2_TYPE_AUTHORITY, &tlv_arg);
+       ret = smp_fetch_fc_pp_tlv(&tlv_arg, smp, kw, private);
+       smp->flags &= ~SMP_F_NOT_LAST; // return only the first authority
+       return ret;
 }
 
 /* fetch the unique ID TLV from a PROXY protocol header */