commit 54948f3fd310ffc74a6c252dc11046a8a18ab230 Author: Jerome Magnin Date: Sat Nov 9 18:00:47 2019 +0100 BUG/MINOR: stream: init variables when the list is empty We need to call vars_init() when the list is empty otherwise we can't use variables in the response scope. This regression was introduced by cda7f3f5 (MINOR: stream: don't prune variables if the list is empty). The following config reproduces the issue: defaults mode http frontend in bind *:11223 http-request set-var(req.foo) str("foo") if { path /bar } http-request set-header bar %[var(req.foo)] if { var(req.foo) -m found } http-response set-var(res.bar) str("bar") http-response set-header foo %[var(res.bar)] if { var(res.bar) -m found } use_backend out backend out server s1 127.0.0.1:11224 listen back bind *:11224 http-request deny deny_status 200 > GET /ba HTTP/1.1 > Host: localhost:11223 > User-Agent: curl/7.66.0 > Accept: */* > < HTTP/1.0 200 OK < Cache-Control: no-cache < Content-Type: text/html > GET /bar HTTP/1.1 > Host: localhost:11223 > User-Agent: curl/7.66.0 > Accept: */* > < HTTP/1.0 200 OK < Cache-Control: no-cache < Content-Type: text/html < foo: bar This must be backported as far as 1.9. (cherry picked from commit 2f44e8843a553ef0f9c53c9b27899727de097777) Signed-off-by: Willy Tarreau diff --git a/src/stream.c b/src/stream.c index 4a7ced22..9fe0efaf 100644 --- a/src/stream.c +++ b/src/stream.c @@ -2399,10 +2399,9 @@ struct task *process_stream(struct task *t, void *context, unsigned short state) if (si_state_in(si_b->state, SI_SB_REQ|SI_SB_QUE|SI_SB_TAR|SI_SB_ASS)) { /* prune the request variables and swap to the response variables. */ if (s->vars_reqres.scope != SCOPE_RES) { - if (!LIST_ISEMPTY(&s->vars_reqres.head)) { + if (!LIST_ISEMPTY(&s->vars_reqres.head)) vars_prune(&s->vars_reqres, s->sess, s); - vars_init(&s->vars_reqres, SCOPE_RES); - } + vars_init(&s->vars_reqres, SCOPE_RES); } do {