From: Christopher Faulet Date: Tue, 20 Feb 2024 07:43:09 +0000 (+0100) Subject: MINOR: stconn: Add a connection flag to notify sending data are the last ones X-Git-Tag: v3.0-dev7~54 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=838fb54de6894736e028745ea7eba4e117dde838;p=thirdparty%2Fhaproxy.git MINOR: stconn: Add a connection flag to notify sending data are the last ones This flag can be use by endpoints to know the data to send, via .snd_buf callback function are the last ones. It is useful to know a shutdown is pending but it cannot be delivered while sedning data are not consumed. --- diff --git a/include/haproxy/connection-t.h b/include/haproxy/connection-t.h index 00639dd6bc..5adf3cf2dd 100644 --- a/include/haproxy/connection-t.h +++ b/include/haproxy/connection-t.h @@ -278,6 +278,7 @@ enum { enum { CO_SFL_MSG_MORE = 0x0001, /* More data to come afterwards */ CO_SFL_STREAMER = 0x0002, /* Producer is continuously streaming data */ + CO_SFL_LAST_DATA = 0x0003, /* Sent data are the last ones, shutdown is pending */ }; /* mux->shutr() modes */ diff --git a/src/stconn.c b/src/stconn.c index c6515b14e5..0383e24048 100644 --- a/src/stconn.c +++ b/src/stconn.c @@ -1636,6 +1636,9 @@ int sc_conn_send(struct stconn *sc) } } + if ((sc->flags & SC_FL_SHUT_WANTED) && co_data(oc) == c_data(oc)) + send_flag |= CO_SFL_LAST_DATA; + ret = conn->mux->snd_buf(sc, &oc->buf, co_data(oc), send_flag); if (ret > 0) { did_send = 1; @@ -2154,7 +2157,12 @@ int sc_applet_send(struct stconn *sc) BUG_ON(sc_ep_have_ff_data(sc)); if (co_data(oc)) { - ret = appctx_snd_buf(sc, &oc->buf, co_data(oc), 0); + unsigned int send_flag = 0; + + if ((sc->flags & SC_FL_SHUT_WANTED) && co_data(oc) == c_data(oc)) + send_flag |= CO_SFL_LAST_DATA; + + ret = appctx_snd_buf(sc, &oc->buf, co_data(oc), send_flag); if (ret > 0) { did_send = 1; c_rew(oc, ret);