|
|
- 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 {
|