From: Jaroslaw Rzeszótko Date: Tue, 2 Nov 2021 15:56:05 +0000 (+0100) Subject: MINOR: vars: add "set-var" for "tcp-request connection" rules. X-Git-Tag: v2.5-dev12~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c8637032a7ce8dbb720cc9d69c12220757f4ee1e;p=thirdparty%2Fhaproxy.git MINOR: vars: add "set-var" for "tcp-request connection" rules. Session struct is already allocated when "tcp-request connection" rules are evaluated so session-scoped variables turned out easy to support. This resolves github issue #1408. --- diff --git a/doc/configuration.txt b/doc/configuration.txt index 20c0f74542..09e27b0b16 100644 --- a/doc/configuration.txt +++ b/doc/configuration.txt @@ -11982,10 +11982,13 @@ tcp-request connection [ { if | unless } ] - set-src - set-src-port - set-tos + - set-var() + - set-var-fmt() - silent-drop - track-sc0 [table ] - track-sc1 [table
] - track-sc2 [table
] + - unset-var() The supported actions are described below. @@ -12110,6 +12113,14 @@ tcp-request connection set-tos [ { if | unless } ] to the value passed in on platforms which support this. Please refer to "http-request set-tos" for a complete description. +tcp-request connection set-var() [ { if | unless } ] +tcp-request connection set-var-fmt() [ { if | unless } ] + + This is used to set the contents of a variable. The variable is declared + inline. "tcp-request connection" can set variables in the "proc" and "sess" + scopes. Please refer to "http-request set-var" and "http-request set-var-fmt" + for a complete description. + tcp-request connection silent-drop [ { if | unless } ] This stops the evaluation of the rules and makes the client-facing connection @@ -12125,6 +12136,11 @@ tcp-request connection track-sc2 [table
] [ { if | unless } ) [ { if | unless } ] + + This is used to unset a variable. Please refer to "http-request set-var" for + details about variables. + tcp-request content [{if | unless} ] Perform an action on a new session depending on a layer 4-7 condition diff --git a/src/vars.c b/src/vars.c index 0de90d86fa..a61fb12338 100644 --- a/src/vars.c +++ b/src/vars.c @@ -659,6 +659,7 @@ static enum act_return action_store(struct act_rule *rule, struct proxy *px, int dir; switch (rule->from) { + case ACT_F_TCP_REQ_CON: dir = SMP_OPT_DIR_REQ; break; case ACT_F_TCP_REQ_SES: dir = SMP_OPT_DIR_REQ; break; case ACT_F_TCP_REQ_CNT: dir = SMP_OPT_DIR_REQ; break; case ACT_F_TCP_RES_CNT: dir = SMP_OPT_DIR_RES; break; @@ -827,6 +828,10 @@ static enum act_parse_ret parse_store(const char **args, int *arg, struct proxy kw_name = args[*arg-1]; switch (rule->from) { + case ACT_F_TCP_REQ_CON: + flags = SMP_VAL_FE_CON_ACC; + px->conf.args.ctx = ARGC_TCO; + break; case ACT_F_TCP_REQ_SES: flags = SMP_VAL_FE_SES_ACC; px->conf.args.ctx = ARGC_TSE; @@ -1213,6 +1218,15 @@ static struct sample_conv_kw_list sample_conv_kws = {ILH, { INITCALL1(STG_REGISTER, sample_register_convs, &sample_conv_kws); +static struct action_kw_list tcp_req_conn_kws = { { }, { + { "set-var-fmt", parse_store, KWF_MATCH_PREFIX }, + { "set-var", parse_store, KWF_MATCH_PREFIX }, + { "unset-var", parse_store, KWF_MATCH_PREFIX }, + { /* END */ } +}}; + +INITCALL1(STG_REGISTER, tcp_req_conn_keywords_register, &tcp_req_conn_kws); + static struct action_kw_list tcp_req_sess_kws = { { }, { { "set-var-fmt", parse_store, KWF_MATCH_PREFIX }, { "set-var", parse_store, KWF_MATCH_PREFIX },