diff --git a/src/mux_quic.c b/src/mux_quic.c index e7ca77a89..74faaa493 100644 --- a/src/mux_quic.c +++ b/src/mux_quic.c @@ -315,26 +315,26 @@ static void qcc_refresh_timeout(struct qcc *qcc) goto leave; } - /* Frontend timeout management + /* Timeout management * - detached streams with data left to send -> default timeout * - shutdown done -> timeout client-fin - * - stream waiting on incomplete request or no stream yet activated -> timeout http-request - * - idle after stream processing -> timeout http-keep-alive + * - (FE only) stream waiting on incomplete request or no stream yet activated -> timeout http-request + * - (FE only) idle after stream processing -> timeout http-keep-alive * * If proxy stop-stop in progress, immediate or spread close will be * processed if shutdown already one or connection is idle. */ - if (!conn_is_back(qcc->conn)) { - if (!LIST_ISEMPTY(&qcc->send_list) || !LIST_ISEMPTY(&qcc->tx.frms)) { - TRACE_DEVEL("pending output data", QMUX_EV_QCC_WAKE, qcc->conn); - qcc->task->expire = tick_add_ifset(now_ms, qcc->timeout); - } - else if (qcc->app_st >= QCC_APP_ST_SHUT) { - TRACE_DEVEL("connection in closing", QMUX_EV_QCC_WAKE, qcc->conn); - qcc->task->expire = tick_add_ifset(now_ms, - qcc->shut_timeout); - } - else if (!LIST_ISEMPTY(&qcc->opening_list) || unlikely(!qcc->largest_bidi_r)) { + if (!LIST_ISEMPTY(&qcc->send_list) || !LIST_ISEMPTY(&qcc->tx.frms)) { + TRACE_DEVEL("pending output data", QMUX_EV_QCC_WAKE, qcc->conn); + qcc->task->expire = tick_add_ifset(now_ms, qcc->timeout); + } + else if (qcc->app_st >= QCC_APP_ST_SHUT) { + TRACE_DEVEL("connection in closing", QMUX_EV_QCC_WAKE, qcc->conn); + qcc->task->expire = tick_add_ifset(now_ms, + qcc->shut_timeout); + } + else if (!conn_is_back(qcc->conn)) { + if (!LIST_ISEMPTY(&qcc->opening_list) || unlikely(!qcc->largest_bidi_r)) { int timeout = px->timeout.httpreq; struct qcs *qcs = NULL; int base_time; @@ -356,6 +356,12 @@ static void qcc_refresh_timeout(struct qcc *qcc) TRACE_DEVEL("at least one request achieved but none currently in progress", QMUX_EV_QCC_WAKE, qcc->conn); qcc->task->expire = tick_add_ifset(qcc->idle_start, timeout); } + + /* Fallback to client timeout if specific value not set. */ + if (!tick_isset(qcc->task->expire)) { + TRACE_DEVEL("fallback to default timeout", QMUX_EV_QCC_WAKE, qcc->conn); + qcc->task->expire = tick_add_ifset(now_ms, qcc->timeout); + } } /* If proxy soft-stop in progress and connection is inactive, @@ -392,14 +398,6 @@ static void qcc_refresh_timeout(struct qcc *qcc) } } - /* fallback to default timeout if frontend specific undefined or for - * backend connections. - */ - if (!tick_isset(qcc->task->expire)) { - TRACE_DEVEL("fallback to default timeout", QMUX_EV_QCC_WAKE, qcc->conn); - qcc->task->expire = tick_add_ifset(now_ms, qcc->timeout); - } - task_queue(qcc->task); leave: