MEDIUM: http: pass ACT_FLAG_FINAL to custom actions
In HTTP it's more difficult to know when to pass the flag or not
because all actions are supposed to be final and there's no inspection
delay. Also, the input channel may very well be closed without this
being an error. So we only set the flag when option abortonclose is
set and the input channel is closed, which is the only case where the
user explicitly wants to forward a close down the chain.
diff --git a/src/proto_http.c b/src/proto_http.c
index d04c15f..e646f79 100644
--- a/src/proto_http.c
+++ b/src/proto_http.c
@@ -3497,6 +3497,7 @@
struct act_rule *rule;
struct hdr_ctx ctx;
const char *auth_realm;
+ int final;
/* If "the current_rule_list" match the executed rule list, we are in
* resume condition. If a resume is needed it is always in the action
@@ -3709,7 +3710,11 @@
}
case ACT_CUSTOM:
- switch (rule->action_ptr(rule, px, s->sess, s, 0)) {
+ final = 0;
+ if (px->options & PR_O_ABRT_CLOSE)
+ final = (s->req.flags & (CF_SHUTR|CF_READ_NULL|CF_READ_ERROR));
+
+ switch (rule->action_ptr(rule, px, s->sess, s, final)) {
case ACT_RET_ERR:
case ACT_RET_CONT:
break;
@@ -3804,6 +3809,7 @@
struct connection *cli_conn;
struct act_rule *rule;
struct hdr_ctx ctx;
+ int final;
/* If "the current_rule_list" match the executed rule list, we are in
* resume condition. If a resume is needed it is always in the action
@@ -3991,7 +3997,11 @@
return HTTP_RULE_RES_DONE;
case ACT_CUSTOM:
- switch (rule->action_ptr(rule, px, s->sess, s, 0)) {
+ final = 0;
+ if (px->options & PR_O_ABRT_CLOSE)
+ final = (s->req.flags & (CF_SHUTR|CF_READ_NULL|CF_READ_ERROR));
+
+ switch (rule->action_ptr(rule, px, s->sess, s, final)) {
case ACT_RET_ERR:
case ACT_RET_CONT:
break;