From 678aaf8e4c9b7fe77ae460103e1877939aec8a4a Mon Sep 17 00:00:00 2001 From: Matthew Keeler Date: Fri, 20 Feb 2026 20:12:14 -0500 Subject: [PATCH] chore: Support http-proxy contract-test capability --- contract-tests/src/client_entity.rs | 20 ++++++++++++++------ contract-tests/src/main.rs | 9 +++++++++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/contract-tests/src/client_entity.rs b/contract-tests/src/client_entity.rs index ee9036a..ca457c2 100644 --- a/contract-tests/src/client_entity.rs +++ b/contract-tests/src/client_entity.rs @@ -39,11 +39,19 @@ impl ClientEntity { create_instance_params: CreateInstanceParams, connector: HttpsConnector, ) -> Result { + let proxy = create_instance_params + .configuration + .proxy + .unwrap_or_default() + .http_proxy + .unwrap_or_default(); + let mut transport_builder = launchdarkly_sdk_transport::HyperTransport::builder(); + if !proxy.is_empty() { + transport_builder = transport_builder.proxy_url(proxy.clone()); + } + // Create fresh transports for this client to avoid shared connection pool issues - let transport = launchdarkly_sdk_transport::HyperTransport::builder() - .build_with_connector(connector.clone()) - .map_err(|e| BuildError::InvalidConfig(e.to_string()))?; - let streaming_https_transport = launchdarkly_sdk_transport::HyperTransport::builder() + let transport = transport_builder .build_with_connector(connector.clone()) .map_err(|e| BuildError::InvalidConfig(e.to_string()))?; let mut config_builder = @@ -88,7 +96,7 @@ impl ClientEntity { if let Some(delay) = streaming.initial_retry_delay_ms { streaming_builder.initial_reconnect_delay(Duration::from_millis(delay)); } - streaming_builder.transport(streaming_https_transport.clone()); + streaming_builder.transport(transport.clone()); config_builder = config_builder.data_source(&streaming_builder); } else if let Some(polling) = create_instance_params.configuration.polling { @@ -108,7 +116,7 @@ impl ClientEntity { // customization we provide is the transport to support testing multiple // transport implementations. let mut streaming_builder = StreamingDataSourceBuilder::new(); - streaming_builder.transport(streaming_https_transport); + streaming_builder.transport(transport.clone()); config_builder = config_builder.data_source(&streaming_builder); } diff --git a/contract-tests/src/main.rs b/contract-tests/src/main.rs index 480b2ad..676b361 100644 --- a/contract-tests/src/main.rs +++ b/contract-tests/src/main.rs @@ -18,6 +18,12 @@ struct Status { capabilities: Vec, } +#[derive(Deserialize, Debug, Default)] +#[serde(rename_all = "camelCase")] +pub struct ProxyParameters { + pub http_proxy: Option, +} + #[derive(Deserialize, Debug)] #[serde(rename_all = "camelCase")] pub struct StreamingParameters { @@ -72,6 +78,8 @@ pub struct Configuration { #[serde(default = "bool::default")] pub init_can_fail: bool, + pub proxy: Option, + pub streaming: Option, pub polling: Option, @@ -103,6 +111,7 @@ async fn status() -> impl Responder { "tags".to_string(), "service-endpoints".to_string(), "context-type".to_string(), + "http-proxy".to_string(), #[cfg(any(feature = "crypto-aws-lc-rs", feature = "crypto-openssl"))] "secure-mode-hash".to_string(), "inline-context-all".to_string(),