diff --git a/include/haproxy/connection-t.h b/include/haproxy/connection-t.h index 00639dd6b..5adf3cf2d 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 c6515b14e..0383e2404 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);