diff --git a/include/haproxy/connection.h b/include/haproxy/connection.h index e21d8294d..fb14eed12 100644 --- a/include/haproxy/connection.h +++ b/include/haproxy/connection.h @@ -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 */ /* diff --git a/src/connection.c b/src/connection.c index 5bcc4d032..82a9ef39a 100644 --- a/src/connection.c +++ b/src/connection.c @@ -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; + struct arg tlv_arg; + int ret; - 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; - - 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 */