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.
This commit is contained in:
Willy Tarreau 2015-09-27 10:33:15 +02:00
parent c1b10d38d7
commit 394586836f

View File

@ -3497,6 +3497,7 @@ http_req_get_intercept_rule(struct proxy *px, struct list *rules, struct stream
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 @@ resume_execution:
}
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 @@ http_res_get_intercept_rule(struct proxy *px, struct list *rules, struct stream
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 @@ resume_execution:
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;