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 { enum act_return {
ACT_RET_CONT, /* continue processing. */ ACT_RET_CONT, /* continue processing. */
ACT_RET_STOP, /* stop processing. */
ACT_RET_YIELD, /* call me again. */ ACT_RET_YIELD, /* call me again. */
ACT_RET_ERR, /* processing error. */ ACT_RET_ERR, /* processing error. */
}; };
@ -44,8 +45,7 @@ enum act_parse_ret {
}; };
enum act_name { enum act_name {
ACT_ACTION_CONT = 0, ACT_CUSTOM = 0,
ACT_ACTION_STOP,
/* common action */ /* common action */
ACT_ACTION_ALLOW, 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. */ /* TODO: later accept arguments. */
rule->arg.hlua_rule->args = NULL; rule->arg.hlua_rule->args = NULL;
rule->action = ACT_ACTION_CONT; rule->action = ACT_CUSTOM;
rule->action_ptr = hlua_action; rule->action_ptr = hlua_action;
return ACT_RET_PRS_OK; return ACT_RET_PRS_OK;
} }

View File

@ -3712,26 +3712,19 @@ http_req_get_intercept_rule(struct proxy *px, struct list *rules, struct stream
break; break;
} }
case ACT_ACTION_CONT: case ACT_CUSTOM:
switch (rule->action_ptr(rule, px, s->sess, s)) { switch (rule->action_ptr(rule, px, s->sess, s)) {
case ACT_RET_ERR: case ACT_RET_ERR:
case ACT_RET_CONT: case ACT_RET_CONT:
break; break;
case ACT_RET_STOP:
return HTTP_RULE_RES_DONE;
case ACT_RET_YIELD: case ACT_RET_YIELD:
s->current_rule = rule; s->current_rule = rule;
return HTTP_RULE_RES_YIELD; return HTTP_RULE_RES_YIELD;
} }
break; 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: case ACT_ACTION_TRK_SC0 ... ACT_ACTION_TRK_SCMAX:
/* Note: only the first valid tracking parameter of each /* Note: only the first valid tracking parameter of each
* applies. * applies.
@ -4001,21 +3994,19 @@ http_res_get_intercept_rule(struct proxy *px, struct list *rules, struct stream
return HTTP_RULE_RES_BADREQ; return HTTP_RULE_RES_BADREQ;
return HTTP_RULE_RES_DONE; return HTTP_RULE_RES_DONE;
case ACT_ACTION_CONT: case ACT_CUSTOM:
switch (rule->action_ptr(rule, px, s->sess, s)) { switch (rule->action_ptr(rule, px, s->sess, s)) {
case ACT_RET_ERR: case ACT_RET_ERR:
case ACT_RET_CONT: case ACT_RET_CONT:
break; break;
case ACT_RET_STOP:
return HTTP_RULE_RES_STOP;
case ACT_RET_YIELD: case ACT_RET_YIELD:
s->current_rule = rule; s->current_rule = rule;
return HTTP_RULE_RES_YIELD; return HTTP_RULE_RES_YIELD;
} }
break; 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. */ /* other flags exists, but normaly, they never be matched. */
default: default:
break; 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; int cur_arg = *orig_arg;
rule->action = ACT_ACTION_CONT; rule->action = ACT_CUSTOM;
switch (args[0][4]) { switch (args[0][4]) {
case 'm' : case 'm' :
@ -12478,7 +12469,7 @@ enum act_parse_ret parse_http_set_status(const char **args, int *orig_arg, struc
{ {
char *error; char *error;
rule->action = ACT_ACTION_CONT; rule->action = ACT_CUSTOM;
rule->action_ptr = action_http_set_status; rule->action_ptr = action_http_set_status;
/* Check if an argument is available */ /* 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->req_cap = hdr;
px->to_log |= LW_REQHDR; px->to_log |= LW_REQHDR;
rule->action = ACT_ACTION_CONT; rule->action = ACT_CUSTOM;
rule->action_ptr = http_action_req_capture; rule->action_ptr = http_action_req_capture;
rule->arg.cap.expr = expr; rule->arg.cap.expr = expr;
rule->arg.cap.hdr = hdr; 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; 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->action_ptr = http_action_req_capture_by_id;
rule->arg.capid.expr = expr; rule->arg.capid.expr = expr;
rule->arg.capid.idx = id; 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; 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->action_ptr = http_action_res_capture_by_id;
rule->arg.capid.expr = expr; rule->arg.capid.expr = expr;
rule->arg.capid.idx = id; rule->arg.capid.idx = id;

View File

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

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; return ACT_RET_PRS_ERR;
} }
} }
rule->action = ACT_ACTION_CONT; rule->action = ACT_CUSTOM;
rule->action_ptr = action_inc_gpc0; rule->action_ptr = action_inc_gpc0;
return ACT_RET_PRS_OK; 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)++; (*arg)++;
rule->action = ACT_ACTION_CONT; rule->action = ACT_CUSTOM;
rule->action_ptr = action_set_gpt0; rule->action_ptr = action_set_gpt0;
return ACT_RET_PRS_OK; 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; return ACT_RET_PRS_ERR;
} }
rule->action = ACT_ACTION_CONT; rule->action = ACT_CUSTOM;
rule->action_ptr = action_store; rule->action_ptr = action_store;
return ACT_RET_PRS_OK; return ACT_RET_PRS_OK;
} }