diff --git a/src/mux_h1.c b/src/mux_h1.c index 21f539d1f..bd7d03835 100644 --- a/src/mux_h1.c +++ b/src/mux_h1.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -1925,13 +1926,21 @@ static void h1_detach(struct conn_stream *cs) h1c = h1s->h1c; h1s->cs = NULL; - if (conn_is_back(h1c->conn) && (h1s->flags & H1S_F_WANT_KAL) && h1c->conn->owner) { + if (conn_is_back(h1c->conn) && (h1s->flags & H1S_F_WANT_KAL) && + !(h1c->conn->flags & (CO_FL_ERROR | CO_FL_SOCK_RD_SH | CO_FL_SOCK_WR_SH))) { + struct stream_interface *si = cs->data; + struct stream *s = si_strm(si); + /* Never ever allow to reuse a connection from a non-reuse backend */ - if (h1c->conn && (h1c->px->options & PR_O_REUSE_MASK) == PR_O_REUSE_NEVR) + if ((h1c->px->options & PR_O_REUSE_MASK) == PR_O_REUSE_NEVR) h1c->conn->flags |= CO_FL_PRIVATE; + if (!(h1c->conn->owner)) { + h1c->conn->owner = s->sess; + session_add_conn(s->sess, h1c->conn, s->target); + } /* we're in keep-alive with an idle connection, monitor it if not already done */ - if (h1c->conn && LIST_ISEMPTY(&h1c->conn->list)) { + if (LIST_ISEMPTY(&h1c->conn->list)) { struct server *srv = objt_server(h1c->conn->target); if (srv) { diff --git a/src/mux_h2.c b/src/mux_h2.c index 806c817bd..807f3197d 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -22,7 +22,9 @@ #include #include #include +#include #include +#include #include #include @@ -2815,6 +2817,34 @@ static void h2_detach(struct conn_stream *cs) return; h2c = h2s->h2c; + if (h2c->proxy->options2 & PR_O2_USE_HTX) { + struct stream_interface *si; + struct stream *s; + + si = cs->data; + s = si_strm(si); + if (!(h2c->conn->flags & + (CO_FL_ERROR | CO_FL_SOCK_RD_SH | CO_FL_SOCK_WR_SH))) { + if (!h2c->conn->owner) { + h2c->conn->owner = s->sess; + session_add_conn(s->sess, h2c->conn, s->target); + } + /* Never ever allow to reuse a connection from a non-reuse backend */ + if ((h2c->proxy->options & PR_O_REUSE_MASK) == PR_O_REUSE_NEVR) + h2c->conn->flags |= CO_FL_PRIVATE; + if (LIST_ISEMPTY(&h2c->conn->list)) { + struct server *srv = objt_server(h2c->conn->target); + + if (srv) { + if (h2c->conn->flags & CO_FL_PRIVATE) + LIST_ADD(&srv->priv_conns[tid], &h2c->conn->list); + else + LIST_ADD(&srv->idle_conns[tid], &h2c->conn->list); + } + + } + } + } h2s->cs = NULL; h2c->nb_cs--; if (h2c->flags & H2_CF_DEM_TOOMANY &&