MINOR: h2: make use of client-fin timeout after GOAWAY
At the moment, the "client" timeout is used on an HTTP/2 connection once
it's idle with no active stream. With this patch, this timeout is replaced
by client-fin once a GOAWAY frame is sent. This closely matches what is
done on HTTP/1 since the principle is the same, as it indicates a willing
ness to quickly close a connection on which we don't expect to see anything
anymore.
diff --git a/src/mux_h2.c b/src/mux_h2.c
index 13d1bb3..90bd36e 100644
--- a/src/mux_h2.c
+++ b/src/mux_h2.c
@@ -104,6 +104,7 @@
int32_t mfs; /* mux's max frame size */
int timeout; /* idle timeout duration in ticks */
+ int shut_timeout; /* idle timeout duration in ticks after GOAWAY was sent */
struct task *task; /* timeout management task */
struct eb_root streams_by_id; /* all active streams by their ID */
struct list send_list; /* list of blocked streams requesting to send */
@@ -332,7 +333,10 @@
goto fail;
- h2c->timeout = sess->fe->timeout.client;
+ h2c->shut_timeout = h2c->timeout = sess->fe->timeout.client;
+ if (tick_isset(sess->fe->timeout.clientfin))
+ h2c->shut_timeout = sess->fe->timeout.clientfin;
+
h2c->task = NULL;
if (tick_isset(h2c->timeout)) {
t = task_new(tid_bit);
@@ -2143,7 +2147,7 @@
if (h2c->task) {
if (eb_is_empty(&h2c->streams_by_id)) {
- h2c->task->expire = tick_add(now_ms, h2c->timeout);
+ h2c->task->expire = tick_add(now_ms, h2c->last_sid < 0 ? h2c->timeout : h2c->shut_timeout);
task_queue(h2c->task);
}
else
@@ -2175,6 +2179,7 @@
}
/* try to send but no need to insist */
+ h2c->last_sid = h2c->max_id;
if (h2c_send_goaway_error(h2c, NULL) <= 0)
h2c->flags |= H2_CF_GOAWAY_FAILED;
@@ -2310,7 +2315,7 @@
}
else if (h2c->task) {
if (eb_is_empty(&h2c->streams_by_id)) {
- h2c->task->expire = tick_add(now_ms, h2c->timeout);
+ h2c->task->expire = tick_add(now_ms, h2c->last_sid < 0 ? h2c->timeout : h2c->shut_timeout);
task_queue(h2c->task);
}
else