commit 54948f3fd310ffc74a6c252dc11046a8a18ab230
|
|
Author: Jerome Magnin <jmagnin@haproxy.com>
|
|
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 <w@1wt.eu>
|
|
|
|
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 {
|