diff --git a/src/async_impl/client.rs b/src/async_impl/client.rs index 85df20947..b6595f925 100644 --- a/src/async_impl/client.rs +++ b/src/async_impl/client.rs @@ -110,6 +110,9 @@ struct Config { http2_initial_connection_window_size: Option, http2_adaptive_window: bool, http2_max_frame_size: Option, + http2_keep_alive_interval: Option, + http2_keep_alive_timeout: Option, + http2_keep_alive_while_idle: bool, local_address: Option, nodelay: bool, #[cfg(feature = "cookies")] @@ -175,6 +178,9 @@ impl ClientBuilder { http2_initial_connection_window_size: None, http2_adaptive_window: false, http2_max_frame_size: None, + http2_keep_alive_interval: None, + http2_keep_alive_timeout: None, + http2_keep_alive_while_idle: false, local_address: None, nodelay: true, trust_dns: cfg!(feature = "trust-dns"), @@ -476,6 +482,15 @@ impl ClientBuilder { if let Some(http2_max_frame_size) = config.http2_max_frame_size { builder.http2_max_frame_size(http2_max_frame_size); } + if let Some(http2_keep_alive_interval) = config.http2_keep_alive_interval { + builder.http2_keep_alive_interval(http2_keep_alive_interval); + } + if let Some(http2_keep_alive_timeout) = config.http2_keep_alive_timeout { + builder.http2_keep_alive_timeout(http2_keep_alive_timeout); + } + if config.http2_keep_alive_while_idle { + builder.http2_keep_alive_while_idle(true); + } builder.pool_idle_timeout(config.pool_idle_timeout); builder.pool_max_idle_per_host(config.pool_max_idle_per_host); @@ -935,6 +950,36 @@ impl ClientBuilder { self } + /// Sets an interval for HTTP2 Ping frames should be sent to keep a connection alive. + /// + /// Pass `None` to disable HTTP2 keep-alive. + /// Default is currently disabled. + pub fn http2_keep_alive_interval(mut self, interval: impl Into>) -> ClientBuilder { + self.config.http2_keep_alive_interval = interval.into(); + self + } + + /// Sets a timeout for receiving an acknowledgement of the keep-alive ping. + /// + /// If the ping is not acknowledged within the timeout, the connection will be closed. + /// Does nothing if `http2_keep_alive_interval` is disabled. + /// Default is currently disabled. + pub fn http2_keep_alive_timeout(mut self, timeout: Duration) -> ClientBuilder { + self.config.http2_keep_alive_timeout = Some(timeout); + self + } + + /// Sets whether HTTP2 keep-alive should apply while the connection is idle. + /// + /// If disabled, keep-alive pings are only sent while there are open request/responses streams. + /// If enabled, pings are also sent when no streams are active. + /// Does nothing if `http2_keep_alive_interval` is disabled. + /// Default is `false`. + pub fn http2_keep_alive_while_idle(mut self, enabled: bool) -> ClientBuilder { + self.config.http2_keep_alive_while_idle = enabled; + self + } + // TCP options /// Set whether sockets have `SO_NODELAY` enabled.