__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 */
/*
/* 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 */