From 089eaa0ba73913187e93d52c3ea34faa01fd8f9c Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Mon, 14 Jan 2019 15:17:46 +0100 Subject: [PATCH] BUG/MINOR: backend: don't use url_param_name as a hint for BE_LB_ALGO_PH At a few places in the code we used to rely on this variable to guess what LB algo was in place. This is wrong because if the defaults section presets "balance url_param foo" and a backend uses "balance roundrobin", these locations will still see this url_param_name set and consider it. The harm is limited, as this only causes the beginning of the request body to be buffered. And in general this is a bad practice which prevents us from cleaning the lbprm stuff. Let's explicitly check the LB algo instead. This may be backported to all currently maintained versions. --- src/proto_http.c | 3 ++- src/proto_htx.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/proto_http.c b/src/proto_http.c index 25e0e3efd..245fa9832 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -3050,7 +3050,8 @@ int http_process_request(struct stream *s, struct channel *req, int an_bit) * that parameter. This will be done in another analyser. */ if (!(s->flags & (SF_ASSIGNED|SF_DIRECT)) && - s->txn->meth == HTTP_METH_POST && s->be->url_param_name != NULL && + s->txn->meth == HTTP_METH_POST && + (s->be->lbprm.algo & BE_LB_ALGO) == BE_LB_ALGO_PH && (msg->flags & (HTTP_MSGF_CNT_LEN|HTTP_MSGF_TE_CHNK))) { channel_dont_connect(req); req->analysers |= AN_REQ_HTTP_BODY; diff --git a/src/proto_htx.c b/src/proto_htx.c index a9752cbfa..236bfd04d 100644 --- a/src/proto_htx.c +++ b/src/proto_htx.c @@ -938,7 +938,8 @@ int htx_process_request(struct stream *s, struct channel *req, int an_bit) * that parameter. This will be done in another analyser. */ if (!(s->flags & (SF_ASSIGNED|SF_DIRECT)) && - s->txn->meth == HTTP_METH_POST && s->be->url_param_name != NULL) { + s->txn->meth == HTTP_METH_POST && + (s->be->lbprm.algo & BE_LB_ALGO) == BE_LB_ALGO_PH) { channel_dont_connect(req); req->analysers |= AN_REQ_HTTP_BODY; }