Skip to content

Commit

Permalink
Feature: Add config setting to disable gzip compression #1627
Browse files Browse the repository at this point in the history
- rounds out all of the https://kubernetes.io/docs/reference/config-api/kubeconfig.v1/#Cluster options

Signed-off-by: Mark Ingram <[email protected]>
  • Loading branch information
markdingram committed Nov 6, 2024
1 parent 179936a commit 06b4b0e
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 1 deletion.
8 changes: 7 additions & 1 deletion kube-client/src/client/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,13 @@ where
#[cfg(feature = "gzip")]
let stack = ServiceBuilder::new()
.layer(stack)
.layer(tower_http::decompression::DecompressionLayer::new())
.layer(
tower_http::decompression::DecompressionLayer::new()
.no_br()
.no_deflate()
.no_zstd()

Check warning on line 165 in kube-client/src/client/builder.rs

View check run for this annotation

Codecov / codecov/patch

kube-client/src/client/builder.rs#L163-L165

Added lines #L163 - L165 were not covered by tests
.gzip(!config.disable_compression),
)
.into_inner();

let service = ServiceBuilder::new()
Expand Down
8 changes: 8 additions & 0 deletions kube-client/src/config/file_config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,14 @@ pub struct Cluster {
#[serde(rename = "proxy-url")]
#[serde(skip_serializing_if = "Option::is_none")]
pub proxy_url: Option<String>,
/// Compression is enabled by default with the `gzip` feature.
/// `disable_compression` allows client to opt-out of response compression for all requests to the server.
/// This is useful to speed up requests (specifically lists) when client-server network bandwidth is ample,
/// by saving time on compression (server-side) and decompression (client-side):
/// https://github.com/kubernetes/kubernetes/issues/112296
#[serde(rename = "disable-compression")]
#[serde(skip_serializing_if = "Option::is_none")]
pub disable_compression: Option<bool>,
/// Name used to check server certificate.
///
/// If `tls_server_name` is `None`, the hostname used to contact the server is used.
Expand Down
7 changes: 7 additions & 0 deletions kube-client/src/config/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,8 @@ pub struct Config {
pub accept_invalid_certs: bool,
/// Stores information to tell the cluster who you are.
pub auth_info: AuthInfo,
/// Whether to disable compression (would only have an effect when the `gzip` feature is enabled)
pub disable_compression: bool,
/// Optional proxy URL. Proxy support requires the `socks5` feature.
pub proxy_url: Option<http::Uri>,
/// If set, apiserver certificate will be validated to contain this string
Expand All @@ -177,6 +179,7 @@ impl Config {
write_timeout: Some(DEFAULT_WRITE_TIMEOUT),
accept_invalid_certs: false,
auth_info: AuthInfo::default(),
disable_compression: false,
proxy_url: None,
tls_server_name: None,
headers: Vec::new(),
Expand Down Expand Up @@ -259,6 +262,7 @@ impl Config {
token_file: Some(incluster_config::token_file()),
..Default::default()
},
disable_compression: false,
proxy_url: None,
tls_server_name: None,
headers: Vec::new(),
Expand Down Expand Up @@ -302,6 +306,8 @@ impl Config {
.unwrap_or_else(|| String::from("default"));

let accept_invalid_certs = loader.cluster.insecure_skip_tls_verify.unwrap_or(false);
let disable_compression = loader.cluster.disable_compression.unwrap_or(false);

let mut root_cert = None;

if let Some(ca_bundle) = loader.ca_bundle()? {
Expand All @@ -316,6 +322,7 @@ impl Config {
read_timeout: Some(DEFAULT_READ_TIMEOUT),
write_timeout: Some(DEFAULT_WRITE_TIMEOUT),
accept_invalid_certs,
disable_compression,
proxy_url: loader.proxy_url()?,
auth_info: loader.user,
tls_server_name: loader.cluster.tls_server_name,
Expand Down

0 comments on commit 06b4b0e

Please sign in to comment.