From ff2381e61e0f814e63190546d23f553e9d77e61e Mon Sep 17 00:00:00 2001 From: Sven-Hendrik Haase Date: Tue, 23 Feb 2021 01:37:28 +0100 Subject: [PATCH] Add http2_adaptive_window and htt2_max_frame_size from hyper (#1194) Fixes #1193. --- src/async_impl/client.rs | 27 +++++++++++++++++++++++++++ src/blocking/client.rs | 15 +++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/src/async_impl/client.rs b/src/async_impl/client.rs index f286f64f7..b19ae7191 100644 --- a/src/async_impl/client.rs +++ b/src/async_impl/client.rs @@ -103,6 +103,8 @@ struct Config { http1_title_case_headers: bool, http2_initial_stream_window_size: Option, http2_initial_connection_window_size: Option, + http2_adaptive_window: bool, + http2_max_frame_size: Option, local_address: Option, nodelay: bool, #[cfg(feature = "cookies")] @@ -159,6 +161,8 @@ impl ClientBuilder { http1_title_case_headers: false, http2_initial_stream_window_size: None, http2_initial_connection_window_size: None, + http2_adaptive_window: false, + http2_max_frame_size: None, local_address: None, nodelay: true, trust_dns: cfg!(feature = "trust-dns"), @@ -332,6 +336,12 @@ impl ClientBuilder { { builder.http2_initial_connection_window_size(http2_initial_connection_window_size); } + if config.http2_adaptive_window { + builder.http2_adaptive_window(true); + } + if let Some(http2_max_frame_size) = config.http2_max_frame_size { + builder.http2_max_frame_size(http2_max_frame_size); + } builder.pool_idle_timeout(config.pool_idle_timeout); builder.pool_max_idle_per_host(config.pool_max_idle_per_host); @@ -680,6 +690,23 @@ impl ClientBuilder { self } + /// Sets whether to use an adaptive flow control. + /// + /// Enabling this will override the limits set in `http2_initial_stream_window_size` and + /// `http2_initial_connection_window_size`. + pub fn http2_adaptive_window(mut self, enabled: bool) -> ClientBuilder { + self.config.http2_adaptive_window = enabled; + self + } + + /// Sets the maximum frame size to use for HTTP2. + /// + /// Default is currently 16,384 but may change internally to optimize for common uses. + pub fn http2_max_frame_size(mut self, sz: impl Into>) -> ClientBuilder { + self.config.http2_max_frame_size = sz.into(); + self + } + // TCP options /// Set whether sockets have `SO_NODELAY` enabled. diff --git a/src/blocking/client.rs b/src/blocking/client.rs index ed1019a0c..10580feea 100644 --- a/src/blocking/client.rs +++ b/src/blocking/client.rs @@ -374,6 +374,21 @@ impl ClientBuilder { self.with_inner(|inner| inner.http2_initial_connection_window_size(sz)) } + /// Sets whether to use an adaptive flow control. + /// + /// Enabling this will override the limits set in `http2_initial_stream_window_size` and + /// `http2_initial_connection_window_size`. + pub fn http2_adaptive_window(self, enabled: bool) -> ClientBuilder { + self.with_inner(|inner| inner.http2_adaptive_window(enabled)) + } + + /// Sets the maximum frame size to use for HTTP2. + /// + /// Default is currently 16,384 but may change internally to optimize for common uses. + pub fn http2_max_frame_size(self, sz: impl Into>) -> ClientBuilder { + self.with_inner(|inner| inner.http2_max_frame_size(sz)) + } + // TCP options /// Set whether sockets have `SO_NODELAY` enabled.