BUG/MEDIUM: http-ana: Never for sending data in TUNNEL mode
When a channel is set in TUNNEL mode, we now always set the CF_NEVER_WAIT flag,
to be sure to never wait for sending data. It is important because in TUNNEL
mode, we have no idea if more data are expected or not. Setting this flag
prevent the MSG_MORE flag to be set on the connection.
It is only a problem with the HTX, since the 2.2. On previous versions, the
MSG_MORE flag is only set on the mux initiative. In fact, the problem arises
because there is an ambiguity in tunnel mode about the HTX_FL_EOI flag. In this
mode, from the mux point of view, while the SHUTR is not received more data are
expected. But from the channel point of view, we want to send data asap.
At short term, this fix is good enough and is valid anyway. But for the long
term more reliable solution must be found. At least, the to_forward field must
regain its original meaning.
This patch must be backported as far as 2.2.
(cherry picked from commit 198ef8b1de3ddac116baeaf5b86f2f8335e69e62)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
(cherry picked from commit 0d4da8c908526e919c103e9ff39786decc5ec787)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
(cherry picked from commit ee20c8c89296474109906a5260a1ca17de533a7f)
[cf: In fact, it should be backported as far as 2.0 to avoid future bugs]
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
(cherry picked from commit 1db883b96412acc09f332186a1506f2d85ccb303)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
diff --git a/src/proto_htx.c b/src/proto_htx.c
index fcb2441..c006009 100644
--- a/src/proto_htx.c
+++ b/src/proto_htx.c
@@ -5293,8 +5293,11 @@
end:
chn->analysers &= AN_REQ_FLT_END;
- if (txn->req.msg_state == HTTP_MSG_TUNNEL && HAS_REQ_DATA_FILTERS(s))
+ if (txn->req.msg_state == HTTP_MSG_TUNNEL) {
+ chn->flags |= CF_NEVER_WAIT;
+ if (HAS_REQ_DATA_FILTERS(s))
chn->analysers |= AN_REQ_FLT_XFER_DATA;
+ }
channel_auto_close(chn);
channel_auto_read(chn);
}
@@ -5402,8 +5405,11 @@
end:
chn->analysers &= AN_RES_FLT_END;
- if (txn->rsp.msg_state == HTTP_MSG_TUNNEL && HAS_RSP_DATA_FILTERS(s))
- chn->analysers |= AN_RES_FLT_XFER_DATA;
+ if (txn->rsp.msg_state == HTTP_MSG_TUNNEL) {
+ chn->flags |= CF_NEVER_WAIT;
+ if (HAS_RSP_DATA_FILTERS(s))
+ chn->analysers |= AN_RES_FLT_XFER_DATA;
+ }
channel_auto_close(chn);
channel_auto_read(chn);
}