]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: stream: init variables when the list is empty
authorJerome Magnin <jmagnin@haproxy.com>
Sat, 9 Nov 2019 17:00:47 +0000 (18:00 +0100)
committerWilly Tarreau <w@1wt.eu>
Sat, 9 Nov 2019 17:25:41 +0000 (18:25 +0100)
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

index be9a9fabe3c8bbfb49af35752a312b478b0c89a5..535bf6a76e1caaceef1b568a9ebd3d1185ad82ec 100644 (file)
@@ -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 {