Repository: seanmonstar/reqwest (language: rust)

Issue:
Allow setting hyper's http2_adaptive_window and http2_max_frame_size
Currently reqwest doesn't allow for setting hyper's `http2_adaptive_window` or `http2_max_frame_size` which would be a convenient thing to do in some circumstances. I think these options should be added.


Discussion / hints:

Fix patch:
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<u32>,
     http2_initial_connection_window_size: Option<u32>,
+    http2_adaptive_window: bool,
+    http2_max_frame_size: Option<u32>,
     local_address: Option<IpAddr>,
     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<Option<u32>>) -> 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<Option<u32>>) -> ClientBuilder {
+        self.with_inner(|inner| inner.http2_max_frame_size(sz))
+    }
+
     // TCP options
 
     /// Set whether sockets have `SO_NODELAY` enabled.


Test patch: