diff --git a/include/haproxy/sc_strm.h b/include/haproxy/sc_strm.h index e58499d7a..579409271 100644 --- a/include/haproxy/sc_strm.h +++ b/include/haproxy/sc_strm.h @@ -401,4 +401,19 @@ static inline void sc_check_timeouts(const struct stconn *sc) sc_oc(sc)->flags |= CF_WRITE_TIMEOUT; } +static inline void sc_set_hcto(struct stconn *sc) +{ + struct stream *strm = __sc_strm(sc); + + if (sc->flags & SC_FL_ISBACK) { + if ((strm->flags & SF_BE_ASSIGNED) && tick_isset(strm->be->timeout.serverfin)) + sc->ioto = strm->be->timeout.serverfin; + } + else { + if (tick_isset(strm_fe(strm)->timeout.clientfin)) + sc->ioto = strm_fe(strm)->timeout.clientfin; + } + +} + #endif /* _HAPROXY_SC_STRM_H */ diff --git a/src/stconn.c b/src/stconn.c index ae537661f..6cf4830ce 100644 --- a/src/stconn.c +++ b/src/stconn.c @@ -568,9 +568,7 @@ static void sc_app_shutw(struct stconn *sc) if (oc->flags & CF_SHUTW) return; oc->flags |= CF_SHUTW|CF_WRITE_EVENT; - - if (tick_isset(sc->hcto)) - sc->ioto = sc->hcto; + sc_set_hcto(sc); switch (sc->state) { case SC_ST_RDY: @@ -701,9 +699,7 @@ static void sc_app_shutw_conn(struct stconn *sc) if (oc->flags & CF_SHUTW) return; oc->flags |= CF_SHUTW|CF_WRITE_EVENT; - - if (tick_isset(sc->hcto)) - sc->ioto = sc->hcto; + sc_set_hcto(sc); switch (sc->state) { case SC_ST_RDY: @@ -898,9 +894,7 @@ static void sc_app_shutw_applet(struct stconn *sc) if (oc->flags & CF_SHUTW) return; oc->flags |= CF_SHUTW|CF_WRITE_EVENT; - - if (tick_isset(sc->hcto)) - sc->ioto = sc->hcto; + sc_set_hcto(sc); /* on shutw we always wake the applet up */ appctx_wakeup(__sc_appctx(sc));