MEDIUM: actions: pass a new "flags" argument to custom actions

Since commit bc4c1ac ("MEDIUM: http/tcp: permit to resume http and tcp
custom actions"), some actions may yield and be called back when new
information are available. Unfortunately some of them may continue to
yield because they simply don't know that it's the last call from the
rule set. For this reason we'll need to pass a flag to the custom
action to pass such information and possibly other at the same time.
This commit is contained in:
Willy Tarreau 2015-09-27 10:00:49 +02:00
parent eba6f64a5f
commit 658b85b68d
6 changed files with 21 additions and 16 deletions

View File

@ -46,6 +46,11 @@ enum act_parse_ret {
ACT_RET_PRS_ERR, /* abort processing. */
};
/* flags passed to custom actions */
enum act_flag {
ACT_FLAG_NONE = 0x00000000, /* no flag */
};
enum act_name {
ACT_CUSTOM = 0,
@ -91,8 +96,8 @@ struct act_rule {
enum act_name action; /* ACT_ACTION_* */
enum act_from from; /* ACT_F_* */
short deny_status; /* HTTP status to return to user when denying */
enum act_return (*action_ptr)(struct act_rule *rule, struct proxy *px,
struct session *sess, struct stream *s); /* ptr to custom action */
enum act_return (*action_ptr)(struct act_rule *rule, struct proxy *px, /* ptr to custom action */
struct session *sess, struct stream *s, int flags);
struct action_kw *kw;
union {
struct {

View File

@ -4469,7 +4469,7 @@ __LJMP static int hlua_register_fetches(lua_State *L)
* because the LUA returns a yield.
*/
static enum act_return hlua_action(struct act_rule *rule, struct proxy *px,
struct session *sess, struct stream *s)
struct session *sess, struct stream *s, int flags)
{
char **arg;
unsigned int analyzer;

View File

@ -3709,7 +3709,7 @@ http_req_get_intercept_rule(struct proxy *px, struct list *rules, struct stream
}
case ACT_CUSTOM:
switch (rule->action_ptr(rule, px, s->sess, s)) {
switch (rule->action_ptr(rule, px, s->sess, s, 0)) {
case ACT_RET_ERR:
case ACT_RET_CONT:
break;
@ -3991,7 +3991,7 @@ http_res_get_intercept_rule(struct proxy *px, struct list *rules, struct stream
return HTTP_RULE_RES_DONE;
case ACT_CUSTOM:
switch (rule->action_ptr(rule, px, s->sess, s)) {
switch (rule->action_ptr(rule, px, s->sess, s, 0)) {
case ACT_RET_ERR:
case ACT_RET_CONT:
break;
@ -12382,7 +12382,7 @@ void http_set_status(unsigned int status, struct stream *s)
* occurs the action is canceled, but the rule processing continue.
*/
enum act_return http_action_set_req_line(struct act_rule *rule, struct proxy *px,
struct session *sess, struct stream *s)
struct session *sess, struct stream *s, int flags)
{
chunk_reset(&trash);
@ -12397,7 +12397,7 @@ enum act_return http_action_set_req_line(struct act_rule *rule, struct proxy *px
/* This function is just a compliant action wrapper for "set-status". */
enum act_return action_http_set_status(struct act_rule *rule, struct proxy *px,
struct session *sess, struct stream *s)
struct session *sess, struct stream *s, int flags)
{
http_set_status(rule->arg.status.code, s);
return ACT_RET_CONT;
@ -12495,7 +12495,7 @@ enum act_parse_ret parse_http_set_status(const char **args, int *orig_arg, struc
* processing continues.
*/
enum act_return http_action_req_capture(struct act_rule *rule, struct proxy *px,
struct session *sess, struct stream *s)
struct session *sess, struct stream *s, int flags)
{
struct sample *key;
struct cap_hdr *h = rule->arg.cap.hdr;
@ -12527,7 +12527,7 @@ enum act_return http_action_req_capture(struct act_rule *rule, struct proxy *px,
* error occurs the action is cancelled, but the rule processing continues.
*/
enum act_return http_action_req_capture_by_id(struct act_rule *rule, struct proxy *px,
struct session *sess, struct stream *s)
struct session *sess, struct stream *s, int flags)
{
struct sample *key;
struct cap_hdr *h;
@ -12695,7 +12695,7 @@ enum act_parse_ret parse_http_req_capture(const char **args, int *orig_arg, stru
* error occurs the action is cancelled, but the rule processing continues.
*/
enum act_return http_action_res_capture_by_id(struct act_rule *rule, struct proxy *px,
struct session *sess, struct stream *s)
struct session *sess, struct stream *s, int flags)
{
struct sample *key;
struct cap_hdr *h;

View File

@ -1165,7 +1165,7 @@ int tcp_inspect_request(struct stream *s, struct channel *req, int an_bit)
/* Custom keywords. */
if (!rule->action_ptr)
continue;
switch (rule->action_ptr(rule, s->be, s->sess, s)) {
switch (rule->action_ptr(rule, s->be, s->sess, s, 0)) {
case ACT_RET_ERR:
case ACT_RET_CONT:
continue;
@ -1294,7 +1294,7 @@ int tcp_inspect_response(struct stream *s, struct channel *rep, int an_bit)
/* Custom keywords. */
if (!rule->action_ptr)
continue;
switch (rule->action_ptr(rule, s->be, s->sess, s)) {
switch (rule->action_ptr(rule, s->be, s->sess, s, 0)) {
case ACT_RET_ERR:
case ACT_RET_CONT:
continue;
@ -1382,7 +1382,7 @@ int tcp_exec_req_rules(struct session *sess)
/* Custom keywords. */
if (rule->action_ptr)
break;
switch (rule->action_ptr(rule, sess->fe, sess, NULL)) {
switch (rule->action_ptr(rule, sess->fe, sess, NULL, 0)) {
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.

View File

@ -1313,7 +1313,7 @@ static int sample_conv_table_trackers(const struct arg *arg_p, struct sample *sm
/* Always returns 1. */
static enum act_return action_inc_gpc0(struct act_rule *rule, struct proxy *px,
struct session *sess, struct stream *s)
struct session *sess, struct stream *s, int flags)
{
void *ptr;
struct stksess *ts;
@ -1382,7 +1382,7 @@ static enum act_parse_ret parse_inc_gpc0(const char **args, int *arg, struct pro
/* Always returns 1. */
static enum act_return action_set_gpt0(struct act_rule *rule, struct proxy *px,
struct session *sess, struct stream *s)
struct session *sess, struct stream *s, int flags)
{
void *ptr;
struct stksess *ts;

View File

@ -481,7 +481,7 @@ int vars_get_by_desc(const struct var_desc *var_desc, struct stream *strm, struc
/* Always returns ACT_RET_CONT even if an error occurs. */
static enum act_return action_store(struct act_rule *rule, struct proxy *px,
struct session *sess, struct stream *s)
struct session *sess, struct stream *s, int flags)
{
struct sample smp;
int dir;