MEDIUM: actions: remove ACTION_STOP

Before this patch, two type of custom actions exists: ACT_ACTION_CONT and
ACT_ACTION_STOP. ACT_ACTION_CONT is a non terminal action and ACT_ACTION_STOP is
a terminal action.

Note that ACT_ACTION_STOP is not used in HAProxy.

This patch remove this behavior. Only type type of custom action exists, and it
is called ACT_CUSTOM. Now, the custion action can return a code indicating the
required behavior. ACT_RET_CONT wants that HAProxy continue the current rule
list evaluation, and ACT_RET_STOP wants that HAPRoxy stops the the current rule
list evaluation.
This commit is contained in:
Thierry FOURNIER 2015-09-02 17:17:33 +02:00 committed by Willy Tarreau
parent bd99d5818d
commit 42148735bc
6 changed files with 59 additions and 74 deletions

View File

@ -34,6 +34,7 @@ enum act_from {
enum act_return {
ACT_RET_CONT, /* continue processing. */
ACT_RET_STOP, /* stop processing. */
ACT_RET_YIELD, /* call me again. */
ACT_RET_ERR, /* processing error. */
};
@ -44,8 +45,7 @@ enum act_parse_ret {
};
enum act_name {
ACT_ACTION_CONT = 0,
ACT_ACTION_STOP,
ACT_CUSTOM = 0,
/* common action */
ACT_ACTION_ALLOW,

View File

@ -4465,7 +4465,7 @@ static enum act_parse_ret action_register_lua(const char **args, int *cur_arg, s
/* TODO: later accept arguments. */
rule->arg.hlua_rule->args = NULL;
rule->action = ACT_ACTION_CONT;
rule->action = ACT_CUSTOM;
rule->action_ptr = hlua_action;
return ACT_RET_PRS_OK;
}

View File

@ -3712,26 +3712,19 @@ resume_execution:
break;
}
case ACT_ACTION_CONT:
case ACT_CUSTOM:
switch (rule->action_ptr(rule, px, s->sess, s)) {
case ACT_RET_ERR:
case ACT_RET_CONT:
break;
case ACT_RET_STOP:
return HTTP_RULE_RES_DONE;
case ACT_RET_YIELD:
s->current_rule = rule;
return HTTP_RULE_RES_YIELD;
}
break;
case ACT_ACTION_STOP:
switch (rule->action_ptr(rule, px, s->sess, s)) {
case ACT_RET_YIELD:
case ACT_RET_ERR:
case ACT_RET_CONT:
return HTTP_RULE_RES_DONE;
}
break;
case ACT_ACTION_TRK_SC0 ... ACT_ACTION_TRK_SCMAX:
/* Note: only the first valid tracking parameter of each
* applies.
@ -4001,21 +3994,19 @@ resume_execution:
return HTTP_RULE_RES_BADREQ;
return HTTP_RULE_RES_DONE;
case ACT_ACTION_CONT:
case ACT_CUSTOM:
switch (rule->action_ptr(rule, px, s->sess, s)) {
case ACT_RET_ERR:
case ACT_RET_CONT:
break;
case ACT_RET_STOP:
return HTTP_RULE_RES_STOP;
case ACT_RET_YIELD:
s->current_rule = rule;
return HTTP_RULE_RES_YIELD;
}
break;
case ACT_ACTION_STOP:
rule->action_ptr(rule, px, s->sess, s);
return HTTP_RULE_RES_STOP;
/* other flags exists, but normaly, they never be matched. */
default:
break;
@ -12428,7 +12419,7 @@ enum act_parse_ret parse_set_req_line(const char **args, int *orig_arg, struct p
{
int cur_arg = *orig_arg;
rule->action = ACT_ACTION_CONT;
rule->action = ACT_CUSTOM;
switch (args[0][4]) {
case 'm' :
@ -12478,7 +12469,7 @@ enum act_parse_ret parse_http_set_status(const char **args, int *orig_arg, struc
{
char *error;
rule->action = ACT_ACTION_CONT;
rule->action = ACT_CUSTOM;
rule->action_ptr = action_http_set_status;
/* Check if an argument is available */
@ -12654,7 +12645,7 @@ enum act_parse_ret parse_http_req_capture(const char **args, int *orig_arg, stru
px->req_cap = hdr;
px->to_log |= LW_REQHDR;
rule->action = ACT_ACTION_CONT;
rule->action = ACT_CUSTOM;
rule->action_ptr = http_action_req_capture;
rule->arg.cap.expr = expr;
rule->arg.cap.hdr = hdr;
@ -12682,7 +12673,7 @@ enum act_parse_ret parse_http_req_capture(const char **args, int *orig_arg, stru
proxy->conf.args.ctx = ARGC_CAP;
rule->action = ACT_ACTION_CONT;
rule->action = ACT_CUSTOM;
rule->action_ptr = http_action_req_capture_by_id;
rule->arg.capid.expr = expr;
rule->arg.capid.idx = id;
@ -12805,7 +12796,7 @@ enum act_parse_ret parse_http_res_capture(const char **args, int *orig_arg, stru
proxy->conf.args.ctx = ARGC_CAP;
rule->action = ACT_ACTION_CONT;
rule->action = ACT_CUSTOM;
rule->action_ptr = http_action_res_capture_by_id;
rule->arg.capid.expr = expr;
rule->arg.capid.idx = id;

View File

@ -1163,21 +1163,19 @@ resume_execution:
}
else {
/* Custom keywords. */
if (rule->action_ptr) {
switch (rule->action_ptr(rule, s->be, s->sess, s)) {
case ACT_RET_ERR:
case ACT_RET_CONT:
break;
case ACT_RET_YIELD:
s->current_rule = rule;
goto missing_data;
}
}
/* accept */
if (rule->action == ACT_ACTION_STOP)
if (!rule->action_ptr)
continue;
switch (rule->action_ptr(rule, s->be, s->sess, s)) {
case ACT_RET_ERR:
case ACT_RET_CONT:
continue;
case ACT_RET_STOP:
break;
/* otherwise continue */
case ACT_RET_YIELD:
s->current_rule = rule;
goto missing_data;
}
break; /* ACT_RET_STOP */
}
}
}
@ -1294,22 +1292,20 @@ resume_execution:
}
else {
/* Custom keywords. */
if (rule->action_ptr) {
switch (rule->action_ptr(rule, s->be, s->sess, s)) {
case ACT_RET_ERR:
case ACT_RET_CONT:
break;
case ACT_RET_YIELD:
channel_dont_close(rep);
s->current_rule = rule;
return 0;
}
}
/* accept */
if (rule->action == ACT_ACTION_STOP)
if (!rule->action_ptr)
continue;
switch (rule->action_ptr(rule, s->be, s->sess, s)) {
case ACT_RET_ERR:
case ACT_RET_CONT:
continue;
case ACT_RET_STOP:
break;
/* otherwise continue */
case ACT_RET_YIELD:
channel_dont_close(rep);
s->current_rule = rule;
return 0;
}
break; /* ACT_RET_STOP */
}
}
}
@ -1384,26 +1380,24 @@ int tcp_exec_req_rules(struct session *sess)
}
else {
/* Custom keywords. */
if (rule->action_ptr) {
switch (rule->action_ptr(rule, sess->fe, sess, NULL)) {
case ACT_RET_YIELD:
/* yield is not allowed at this point. If this return code is
* used it is a bug, so I prefer to abort the process.
*/
send_log(sess->fe, LOG_WARNING,
"Internal error: yield not allowed with tcp-request connection actions.");
case ACT_RET_CONT:
break;
case ACT_RET_ERR:
result = 0;
break;
}
if (rule->action == ACT_ACTION_CONT)
continue;
if (rule->action_ptr)
break;
switch (rule->action_ptr(rule, sess->fe, sess, NULL)) {
case ACT_RET_YIELD:
/* yield is not allowed at this point. If this return code is
* used it is a bug, so I prefer to abort the process.
*/
send_log(sess->fe, LOG_WARNING,
"Internal error: yield not allowed with tcp-request connection actions.");
case ACT_RET_STOP:
break;
case ACT_RET_CONT:
continue;
case ACT_RET_ERR:
result = 0;
break;
}
/* otherwise it's an accept */
break;
break; /* ACT_RET_STOP */
}
}
}

View File

@ -1373,7 +1373,7 @@ static enum act_parse_ret parse_inc_gpc0(const char **args, int *arg, struct pro
return ACT_RET_PRS_ERR;
}
}
rule->action = ACT_ACTION_CONT;
rule->action = ACT_CUSTOM;
rule->action_ptr = action_inc_gpc0;
return ACT_RET_PRS_OK;
}
@ -1450,7 +1450,7 @@ static enum act_parse_ret parse_set_gpt0(const char **args, int *arg, struct pro
}
(*arg)++;
rule->action = ACT_ACTION_CONT;
rule->action = ACT_CUSTOM;
rule->action_ptr = action_set_gpt0;
return ACT_RET_PRS_OK;

View File

@ -588,7 +588,7 @@ static enum act_parse_ret parse_store(const char **args, int *arg, struct proxy
return ACT_RET_PRS_ERR;
}
rule->action = ACT_ACTION_CONT;
rule->action = ACT_CUSTOM;
rule->action_ptr = action_store;
return ACT_RET_PRS_OK;
}