]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: actions: pass a new "flags" argument to custom actions
authorWilly Tarreau <w@1wt.eu>
Sun, 27 Sep 2015 08:00:49 +0000 (10:00 +0200)
committerWilly Tarreau <w@1wt.eu>
Sun, 27 Sep 2015 09:04:06 +0000 (11:04 +0200)
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.

include/types/action.h
src/hlua.c
src/proto_http.c
src/proto_tcp.c
src/stick_table.c
src/vars.c

index b7e1063cc555ae5e5cd62eacfa4ae964e4db9f36..5a581c7ba51fcab7bb3e3affd60f2a5050573a20 100644 (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 {
index a4e7fbe6503d4a76319054d1479d70af6b786050..c641c78e04af7b1cae95336f47fe98628d343036 100644 (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;
index 104df2020d7a60d951f39ee3ac3e7992c68b3f32..d04c15f1d300110a096662956f93172e02ea6595 100644 (file)
@@ -3709,7 +3709,7 @@ resume_execution:
                        }
 
                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 @@ resume_execution:
                        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;
index 2ea7161a4b1f48f3a176f1e00a9c2e896972c2de..baac91a6c267574c6739f17926db07dfea832b52 100644 (file)
@@ -1165,7 +1165,7 @@ resume_execution:
                                /* 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 @@ resume_execution:
                                /* 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.
index c3b76ad61835ce308ea4a08b9b8b800c5de741bd..3328616bfd2669abf734e7ace35cc2717b782a05 100644 (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;
index d20839ca1a5f35d2a46f64a5dd954073ebd92ae8..a20dc8bafbc665f21ed7370d11690a87a89f0a3e 100644 (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;