MEDIUM: http: move reqadd after execution of http_request redirect
We still have a plate of spaghetti in the request processing rules.
All http-request rules are executed at once, then some responses are
built interlaced with other rules that used to be there in the past.
Here, reqadd is executed after an http-req redirect rule is *decided*,
but before it is *executed*.
So let's match the doc and config checks, to put the redirect actually
before the reqadd completely.
diff --git a/src/proto_http.c b/src/proto_http.c
index a4470c4..b233fd9 100644
--- a/src/proto_http.c
+++ b/src/proto_http.c
@@ -3949,6 +3949,18 @@
goto return_prx_cond;
}
+ if (http_req_last_rule && http_req_last_rule->action == HTTP_REQ_ACT_REDIR) {
+ if (!http_apply_redirect_rule(http_req_last_rule->arg.redir, s, txn))
+ goto return_bad_req;
+ req->analyse_exp = TICK_ETERNITY;
+ return 1;
+ }
+
+ if (http_req_last_rule && http_req_last_rule->action == HTTP_REQ_ACT_CUSTOM_STOP) {
+ req->analyse_exp = TICK_ETERNITY;
+ return 1;
+ }
+
/* add request headers from the rule sets in the same order */
list_for_each_entry(wl, &px->req_add, list) {
if (wl->cond) {
@@ -3964,18 +3976,6 @@
goto return_bad_req;
}
- if (http_req_last_rule && http_req_last_rule->action == HTTP_REQ_ACT_REDIR) {
- if (!http_apply_redirect_rule(http_req_last_rule->arg.redir, s, txn))
- goto return_bad_req;
- req->analyse_exp = TICK_ETERNITY;
- return 1;
- }
-
- if (http_req_last_rule && http_req_last_rule->action == HTTP_REQ_ACT_CUSTOM_STOP) {
- req->analyse_exp = TICK_ETERNITY;
- return 1;
- }
-
if (unlikely(objt_applet(s->target) == &http_stats_applet)) {
/* process the stats request now */
if (s->fe == s->be) /* report it if the request was intercepted by the frontend */