From 2f44e8843a553ef0f9c53c9b27899727de097777 Mon Sep 17 00:00:00 2001 From: Jerome Magnin Date: Sat, 9 Nov 2019 18:00:47 +0100 Subject: [PATCH] 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. --- src/stream.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/stream.c b/src/stream.c index be9a9fabe..535bf6a76 100644 --- a/src/stream.c +++ b/src/stream.c @@ -2581,10 +2581,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 {