From d07211b028b8b90291aa2924d2b51f011fc14ca9 Mon Sep 17 00:00:00 2001 From: kwasniew Date: Tue, 28 Jan 2025 14:40:18 +0100 Subject: [PATCH 01/21] feat: client identification headers --- Cargo.toml | 2 ++ src/api.rs | 3 ++- src/http.rs | 15 +++++++++++++++ src/lib.rs | 1 + src/version.rs | 23 +++++++++++++++++++++++ 5 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 src/version.rs diff --git a/Cargo.toml b/Cargo.toml index a67f0a8..92e965d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -62,6 +62,7 @@ rustversion = "1.0.7" serde_json = "1.0.68" serde_plain = "1.0.0" surf = { version = "2.3.1", optional = true } +uuid = { version = "1.12.1", features = ["v4"] } [dependencies.chrono] default-features = false @@ -91,6 +92,7 @@ futures = "0.3.17" maplit = "1.0.2" num_cpus = "1.13.0" simple_logger = "2.1.0" +regex = "1.11.1" [dev-dependencies.tokio] features = ["macros", "rt-multi-thread", "time"] diff --git a/src/api.rs b/src/api.rs index 8bc0ec1..66272c2 100644 --- a/src/api.rs +++ b/src/api.rs @@ -3,6 +3,7 @@ use std::collections::HashMap; use std::default::Default; +use crate::version::get_sdk_version; use chrono::Utc; use serde::{Deserialize, Serialize}; @@ -101,7 +102,7 @@ impl Default for Registration { Self { app_name: "".into(), instance_id: "".into(), - sdk_version: "unleash-client-rust-0.1.0".into(), + sdk_version: get_sdk_version().into(), strategies: vec![], started: Utc::now(), interval: 15 * 1000, diff --git a/src/http.rs b/src/http.rs index 5582c94..56a716f 100644 --- a/src/http.rs +++ b/src/http.rs @@ -12,16 +12,23 @@ mod surf; pub struct HTTP { authorization_header: C::HeaderName, app_name_header: C::HeaderName, + x_app_name_header: C::HeaderName, + x_sdk_header: C::HeaderName, + x_connection_id_header: C::HeaderName, instance_id_header: C::HeaderName, app_name: String, + sdk_version: &'static str, instance_id: String, + connection_id: String, authorization: Option, client: C, } use serde::{de::DeserializeOwned, Serialize}; +use uuid::Uuid; #[doc(inline)] pub use shim::HttpClient; +use crate::version::get_sdk_version; impl HTTP where @@ -36,10 +43,15 @@ where Ok(HTTP { client: C::default(), app_name, + sdk_version: get_sdk_version(), + connection_id: Uuid::new_v4().into(), instance_id, authorization, authorization_header: C::build_header("authorization")?, app_name_header: C::build_header("appname")?, + x_app_name_header: C::build_header("x-unleash-appname")?, + x_sdk_header: C::build_header("x-unleash-sdk")?, + x_connection_id_header: C::build_header("x-unleash-connection-id")?, instance_id_header: C::build_header("instance_id")?, }) } @@ -73,6 +85,9 @@ where fn attach_headers(&self, request: C::RequestBuilder) -> C::RequestBuilder { let request = C::header(request, &self.app_name_header, self.app_name.as_str()); + let request = C::header(request, &self.x_app_name_header, self.app_name.as_str()); + let request = C::header(request, &self.x_sdk_header, self.sdk_version); + let request = C::header(request, &self.x_connection_id_header, self.connection_id.as_str()); let request = C::header(request, &self.instance_id_header, self.instance_id.as_str()); if let Some(auth) = &self.authorization { C::header(request, &self.authorization_header.clone(), auth.as_str()) diff --git a/src/lib.rs b/src/lib.rs index 9ad807f..fd45a54 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -124,6 +124,7 @@ pub mod config; pub mod context; pub mod http; pub mod strategy; +pub mod version; // Exports for ergonomical use pub use crate::client::{Client, ClientBuilder}; diff --git a/src/version.rs b/src/version.rs new file mode 100644 index 0000000..e370a84 --- /dev/null +++ b/src/version.rs @@ -0,0 +1,23 @@ +use std::env; + +// include version into the binary at compile time +pub fn get_sdk_version() -> &'static str { + concat!("unleash-client-rust:", env!("CARGO_PKG_VERSION")) +} + +#[cfg(test)] +mod tests { + use regex::Regex; + use super::*; + + #[test] + fn test_get_sdk_version_with_version_set() { + let version_output = get_sdk_version(); + let version_regex = Regex::new(r"^unleash-client-rust:\d+\.\d+\.\d+$").unwrap(); + assert!( + version_regex.is_match(&version_output), + "Version output did not match expected format: {}", + version_output + ); + } +} From 4d58cf70fd7fd779cf02b88bf4e2a52e06798cec Mon Sep 17 00:00:00 2001 From: kwasniew Date: Tue, 28 Jan 2025 14:52:22 +0100 Subject: [PATCH 02/21] feat: client identification headers --- src/http.rs | 10 +++++++--- src/version.rs | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/http.rs b/src/http.rs index 56a716f..5729d8b 100644 --- a/src/http.rs +++ b/src/http.rs @@ -24,11 +24,11 @@ pub struct HTTP { client: C, } +use crate::version::get_sdk_version; use serde::{de::DeserializeOwned, Serialize}; -use uuid::Uuid; #[doc(inline)] pub use shim::HttpClient; -use crate::version::get_sdk_version; +use uuid::Uuid; impl HTTP where @@ -87,7 +87,11 @@ where let request = C::header(request, &self.app_name_header, self.app_name.as_str()); let request = C::header(request, &self.x_app_name_header, self.app_name.as_str()); let request = C::header(request, &self.x_sdk_header, self.sdk_version); - let request = C::header(request, &self.x_connection_id_header, self.connection_id.as_str()); + let request = C::header( + request, + &self.x_connection_id_header, + self.connection_id.as_str(), + ); let request = C::header(request, &self.instance_id_header, self.instance_id.as_str()); if let Some(auth) = &self.authorization { C::header(request, &self.authorization_header.clone(), auth.as_str()) diff --git a/src/version.rs b/src/version.rs index e370a84..3d5941f 100644 --- a/src/version.rs +++ b/src/version.rs @@ -7,8 +7,8 @@ pub fn get_sdk_version() -> &'static str { #[cfg(test)] mod tests { - use regex::Regex; use super::*; + use regex::Regex; #[test] fn test_get_sdk_version_with_version_set() { From ebad2ad46c7ea68206b2bc7a42ab321e9e41054e Mon Sep 17 00:00:00 2001 From: kwasniew Date: Tue, 28 Jan 2025 14:57:43 +0100 Subject: [PATCH 03/21] feat: client identification headers --- src/version.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/version.rs b/src/version.rs index 3d5941f..faf3af0 100644 --- a/src/version.rs +++ b/src/version.rs @@ -15,7 +15,7 @@ mod tests { let version_output = get_sdk_version(); let version_regex = Regex::new(r"^unleash-client-rust:\d+\.\d+\.\d+$").unwrap(); assert!( - version_regex.is_match(&version_output), + version_regex.is_match(version_output), "Version output did not match expected format: {}", version_output ); From d38b17e19862dd6199aa4e51d4b75b3545274d18 Mon Sep 17 00:00:00 2001 From: kwasniew Date: Tue, 28 Jan 2025 15:03:53 +0100 Subject: [PATCH 04/21] feat: client identification headers --- Cargo.toml | 2 +- src/http.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 92e965d..f4fd5e7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -62,7 +62,7 @@ rustversion = "1.0.7" serde_json = "1.0.68" serde_plain = "1.0.0" surf = { version = "2.3.1", optional = true } -uuid = { version = "1.12.1", features = ["v4"] } +uuid = { version = "0.8.2", features = ["v4"] } [dependencies.chrono] default-features = false diff --git a/src/http.rs b/src/http.rs index 5729d8b..6fac87c 100644 --- a/src/http.rs +++ b/src/http.rs @@ -44,7 +44,7 @@ where client: C::default(), app_name, sdk_version: get_sdk_version(), - connection_id: Uuid::new_v4().into(), + connection_id: Uuid::new_v4().to_string(), instance_id, authorization, authorization_header: C::build_header("authorization")?, From 44367bc0e5f07037af29b6bdbc6f2224b5b498c8 Mon Sep 17 00:00:00 2001 From: kwasniew Date: Tue, 28 Jan 2025 15:13:58 +0100 Subject: [PATCH 05/21] feat: client identification headers --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index f4fd5e7..8010fb5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -62,7 +62,7 @@ rustversion = "1.0.7" serde_json = "1.0.68" serde_plain = "1.0.0" surf = { version = "2.3.1", optional = true } -uuid = { version = "0.8.2", features = ["v4"] } +uuid = { version = "0.6.5", features = ["v4"] } [dependencies.chrono] default-features = false From 044fb89830a2e441ca4b1c78f6b696eed9ca7769 Mon Sep 17 00:00:00 2001 From: kwasniew Date: Tue, 28 Jan 2025 15:39:34 +0100 Subject: [PATCH 06/21] feat: client identification headers --- Cargo.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 8010fb5..0ec1445 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -62,7 +62,8 @@ rustversion = "1.0.7" serde_json = "1.0.68" serde_plain = "1.0.0" surf = { version = "2.3.1", optional = true } -uuid = { version = "0.6.5", features = ["v4"] } +uuid = { version = "1.12.1", features = ["v4"] } +libc = { version = "0.2.156" } [dependencies.chrono] default-features = false From f64c42f80f4cf8ccbfeeefa9c9daa67677a824bb Mon Sep 17 00:00:00 2001 From: kwasniew Date: Tue, 28 Jan 2025 15:48:29 +0100 Subject: [PATCH 07/21] feat: client identification headers --- Cargo.toml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 0ec1445..0ec855a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -62,8 +62,7 @@ rustversion = "1.0.7" serde_json = "1.0.68" serde_plain = "1.0.0" surf = { version = "2.3.1", optional = true } -uuid = { version = "1.12.1", features = ["v4"] } -libc = { version = "0.2.156" } +uuid = { version = "1.11.0", features = ["v4"] } [dependencies.chrono] default-features = false From 9f1099e33ed3709c93eb90a0ac1c7c6c53a78653 Mon Sep 17 00:00:00 2001 From: kwasniew Date: Tue, 28 Jan 2025 15:50:14 +0100 Subject: [PATCH 08/21] feat: client identification headers --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 0ec855a..4529b7b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -92,7 +92,7 @@ futures = "0.3.17" maplit = "1.0.2" num_cpus = "1.13.0" simple_logger = "2.1.0" -regex = "1.11.1" +regex = "1.9.6" [dev-dependencies.tokio] features = ["macros", "rt-multi-thread", "time"] From 26c8e50b51e7e13a5a352a36eaaf3f753c0f0970 Mon Sep 17 00:00:00 2001 From: kwasniew Date: Thu, 30 Jan 2025 09:46:08 +0100 Subject: [PATCH 09/21] chore: make module pub crate --- Cargo.toml | 1 + src/version.rs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 4529b7b..c6552ea 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -55,6 +55,7 @@ enum-map = "~2.0.1" futures-timer = "3.0.2" hostname = "0.3.1" ipnet = "2.3.1" +libc = "0.2.146" log = "0.4.14" murmur3 = "0.5.1" rand = "0.8.4" diff --git a/src/version.rs b/src/version.rs index faf3af0..0462a2d 100644 --- a/src/version.rs +++ b/src/version.rs @@ -1,7 +1,7 @@ use std::env; // include version into the binary at compile time -pub fn get_sdk_version() -> &'static str { +pub(crate) fn get_sdk_version() -> &'static str { concat!("unleash-client-rust:", env!("CARGO_PKG_VERSION")) } From b0eaa6e44f314913836e4934ddc2674d680f485f Mon Sep 17 00:00:00 2001 From: kwasniew Date: Thu, 30 Jan 2025 09:55:41 +0100 Subject: [PATCH 10/21] docs: version module --- src/version.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/version.rs b/src/version.rs index 0462a2d..a2b1ff3 100644 --- a/src/version.rs +++ b/src/version.rs @@ -1,6 +1,15 @@ +//! Managing SDK versions +//! +//! This module includes utilities to handle versioning aspects used internally +//! by the crate. use std::env; -// include version into the binary at compile time +/// Returns the version of the `unleash-client-rust` SDK compiled into the binary. +/// +/// The version number is included at compile time using the cargo package version +/// and is formatted as "unleash-client-rust:X.Y.Z", where X.Y.Z is the semantic +/// versioning format. This ensures a consistent versioning approach that aligns +/// with other Unleash SDKs. pub(crate) fn get_sdk_version() -> &'static str { concat!("unleash-client-rust:", env!("CARGO_PKG_VERSION")) } From 34efcbac963a94f415084f34038b714a845d81d1 Mon Sep 17 00:00:00 2001 From: kwasniew Date: Thu, 30 Jan 2025 10:53:55 +0100 Subject: [PATCH 11/21] test: http headers --- src/http.rs | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/src/http.rs b/src/http.rs index 6fac87c..4a864e4 100644 --- a/src/http.rs +++ b/src/http.rs @@ -100,3 +100,108 @@ where } } } + +#[cfg(test)] +mod tests { + use super::*; + use async_trait::async_trait; + use regex::Regex; + use std::collections::HashMap; + + #[derive(Clone)] + struct MockHttpClient { + headers: std::collections::HashMap, + } + + #[async_trait] + impl HttpClient for MockHttpClient { + type Error = std::io::Error; + type HeaderName = String; + type RequestBuilder = Self; + + fn build_header(name: &'static str) -> Result { + Ok(name.to_string()) + } + + fn header(builder: Self, key: &Self::HeaderName, value: &str) -> Self::RequestBuilder { + let mut new_builder = builder; + new_builder.headers.insert(key.clone(), value.to_string()); + new_builder + } + + fn get(&self, _uri: &str) -> Self::RequestBuilder { + self.clone() + } + + fn post(&self, _uri: &str) -> Self::RequestBuilder { + self.clone() + } + + async fn get_json( + _req: Self::RequestBuilder, + ) -> Result { + unimplemented!() + } + + async fn post_json( + _req: Self::RequestBuilder, + _content: &T, + ) -> Result { + unimplemented!() + } + } + + impl Default for MockHttpClient { + fn default() -> Self { + Self { + headers: HashMap::new(), + } + } + } + + #[tokio::test] + async fn test_specific_headers() { + let http_client = HTTP::::new( + "my_app".to_string(), + "my_instance_id".to_string(), + Some("auth_token".to_string()), + ) + .unwrap(); + + let request_builder = http_client.client.post("http://example.com"); + let request_with_headers = http_client.attach_headers(request_builder); + + assert_eq!( + request_with_headers + .headers + .get("x-unleash-appname") + .unwrap(), + "my_app" + ); + assert_eq!( + request_with_headers.headers.get("instance_id").unwrap(), + "my_instance_id" + ); + assert_eq!( + request_with_headers.headers.get("authorization").unwrap(), + "auth_token" + ); + + let version_regex = Regex::new(r"^unleash-client-rust:\d+\.\d+\.\d+$").unwrap(); + let sdk_version = request_with_headers.headers.get("x-unleash-sdk").unwrap(); + assert!( + version_regex.is_match(sdk_version), + "Version output did not match expected format: {}", + sdk_version + ); + + let connection_id = request_with_headers + .headers + .get("x-unleash-connection-id") + .unwrap(); + assert!( + Uuid::parse_str(connection_id).is_ok(), + "Connection ID is not a valid UUID" + ); + } +} From d59c9f54f7e27a3b640dba3331fdbb333b32b786 Mon Sep 17 00:00:00 2001 From: kwasniew Date: Thu, 30 Jan 2025 10:56:58 +0100 Subject: [PATCH 12/21] test: http headers --- src/http.rs | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/src/http.rs b/src/http.rs index 4a864e4..1541d65 100644 --- a/src/http.rs +++ b/src/http.rs @@ -106,9 +106,8 @@ mod tests { use super::*; use async_trait::async_trait; use regex::Regex; - use std::collections::HashMap; - #[derive(Clone)] + #[derive(Clone, Default)] struct MockHttpClient { headers: std::collections::HashMap, } @@ -123,10 +122,9 @@ mod tests { Ok(name.to_string()) } - fn header(builder: Self, key: &Self::HeaderName, value: &str) -> Self::RequestBuilder { - let mut new_builder = builder; - new_builder.headers.insert(key.clone(), value.to_string()); - new_builder + fn header(mut builder: Self, key: &Self::HeaderName, value: &str) -> Self::RequestBuilder { + builder.headers.insert(key.clone(), value.to_string()); + builder } fn get(&self, _uri: &str) -> Self::RequestBuilder { @@ -151,14 +149,6 @@ mod tests { } } - impl Default for MockHttpClient { - fn default() -> Self { - Self { - headers: HashMap::new(), - } - } - } - #[tokio::test] async fn test_specific_headers() { let http_client = HTTP::::new( From 8c707bd8513841e0e21d63b2a0b7865c9e8393dc Mon Sep 17 00:00:00 2001 From: kwasniew Date: Thu, 30 Jan 2025 10:59:18 +0100 Subject: [PATCH 13/21] feat: use custom headers without x --- src/http.rs | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/http.rs b/src/http.rs index 1541d65..a5b4c3f 100644 --- a/src/http.rs +++ b/src/http.rs @@ -49,9 +49,9 @@ where authorization, authorization_header: C::build_header("authorization")?, app_name_header: C::build_header("appname")?, - x_app_name_header: C::build_header("x-unleash-appname")?, - x_sdk_header: C::build_header("x-unleash-sdk")?, - x_connection_id_header: C::build_header("x-unleash-connection-id")?, + x_app_name_header: C::build_header("unleash-appname")?, + x_sdk_header: C::build_header("unleash-sdk")?, + x_connection_id_header: C::build_header("unleash-connection-id")?, instance_id_header: C::build_header("instance_id")?, }) } @@ -162,10 +162,7 @@ mod tests { let request_with_headers = http_client.attach_headers(request_builder); assert_eq!( - request_with_headers - .headers - .get("x-unleash-appname") - .unwrap(), + request_with_headers.headers.get("unleash-appname").unwrap(), "my_app" ); assert_eq!( @@ -178,7 +175,7 @@ mod tests { ); let version_regex = Regex::new(r"^unleash-client-rust:\d+\.\d+\.\d+$").unwrap(); - let sdk_version = request_with_headers.headers.get("x-unleash-sdk").unwrap(); + let sdk_version = request_with_headers.headers.get("unleash-sdk").unwrap(); assert!( version_regex.is_match(sdk_version), "Version output did not match expected format: {}", @@ -187,7 +184,7 @@ mod tests { let connection_id = request_with_headers .headers - .get("x-unleash-connection-id") + .get("unleash-connection-id") .unwrap(); assert!( Uuid::parse_str(connection_id).is_ok(), From b922bd5c3126888d02c69f33d0fc1d3835078fba Mon Sep 17 00:00:00 2001 From: kwasniew Date: Thu, 30 Jan 2025 11:11:46 +0100 Subject: [PATCH 14/21] feat: use custom headers without x --- src/http.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/http.rs b/src/http.rs index a5b4c3f..766f9fa 100644 --- a/src/http.rs +++ b/src/http.rs @@ -12,9 +12,9 @@ mod surf; pub struct HTTP { authorization_header: C::HeaderName, app_name_header: C::HeaderName, - x_app_name_header: C::HeaderName, - x_sdk_header: C::HeaderName, - x_connection_id_header: C::HeaderName, + unleash_app_name_header: C::HeaderName, + unleash_sdk_header: C::HeaderName, + unleash_connection_id_header: C::HeaderName, instance_id_header: C::HeaderName, app_name: String, sdk_version: &'static str, @@ -49,9 +49,9 @@ where authorization, authorization_header: C::build_header("authorization")?, app_name_header: C::build_header("appname")?, - x_app_name_header: C::build_header("unleash-appname")?, - x_sdk_header: C::build_header("unleash-sdk")?, - x_connection_id_header: C::build_header("unleash-connection-id")?, + unleash_app_name_header: C::build_header("unleash-appname")?, + unleash_sdk_header: C::build_header("unleash-sdk")?, + unleash_connection_id_header: C::build_header("unleash-connection-id")?, instance_id_header: C::build_header("instance_id")?, }) } @@ -85,11 +85,11 @@ where fn attach_headers(&self, request: C::RequestBuilder) -> C::RequestBuilder { let request = C::header(request, &self.app_name_header, self.app_name.as_str()); - let request = C::header(request, &self.x_app_name_header, self.app_name.as_str()); - let request = C::header(request, &self.x_sdk_header, self.sdk_version); + let request = C::header(request, &self.unleash_app_name_header, self.app_name.as_str()); + let request = C::header(request, &self.unleash_sdk_header, self.sdk_version); let request = C::header( request, - &self.x_connection_id_header, + &self.unleash_connection_id_header, self.connection_id.as_str(), ); let request = C::header(request, &self.instance_id_header, self.instance_id.as_str()); From 581dee7b01689c0f223097b11aeb4266a82f53d6 Mon Sep 17 00:00:00 2001 From: kwasniew Date: Thu, 30 Jan 2025 11:23:31 +0100 Subject: [PATCH 15/21] fix: clippy --- src/http.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/http.rs b/src/http.rs index 766f9fa..cf50f20 100644 --- a/src/http.rs +++ b/src/http.rs @@ -87,11 +87,7 @@ where let request = C::header(request, &self.app_name_header, self.app_name.as_str()); let request = C::header(request, &self.unleash_app_name_header, self.app_name.as_str()); let request = C::header(request, &self.unleash_sdk_header, self.sdk_version); - let request = C::header( - request, - &self.unleash_connection_id_header, - self.connection_id.as_str(), - ); + let request = C::header(request, &self.unleash_connection_id_header, self.connection_id.as_str()); let request = C::header(request, &self.instance_id_header, self.instance_id.as_str()); if let Some(auth) = &self.authorization { C::header(request, &self.authorization_header.clone(), auth.as_str()) From ee88211b361c146143cee807117129f3ef6c4468 Mon Sep 17 00:00:00 2001 From: kwasniew Date: Thu, 30 Jan 2025 11:38:10 +0100 Subject: [PATCH 16/21] fix: clippy --- src/http.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/http.rs b/src/http.rs index cf50f20..b7171d1 100644 --- a/src/http.rs +++ b/src/http.rs @@ -85,9 +85,17 @@ where fn attach_headers(&self, request: C::RequestBuilder) -> C::RequestBuilder { let request = C::header(request, &self.app_name_header, self.app_name.as_str()); - let request = C::header(request, &self.unleash_app_name_header, self.app_name.as_str()); + let request = C::header( + request, + &self.unleash_app_name_header, + self.app_name.as_str(), + ); let request = C::header(request, &self.unleash_sdk_header, self.sdk_version); - let request = C::header(request, &self.unleash_connection_id_header, self.connection_id.as_str()); + let request = C::header( + request, + &self.unleash_connection_id_header, + self.connection_id.as_str(), + ); let request = C::header(request, &self.instance_id_header, self.instance_id.as_str()); if let Some(auth) = &self.authorization { C::header(request, &self.authorization_header.clone(), auth.as_str()) From 34bc58fd5c03f64087a3961bccf7fde4eb41655f Mon Sep 17 00:00:00 2001 From: kwasniew Date: Tue, 4 Feb 2025 11:23:03 +0100 Subject: [PATCH 17/21] docs: explain connection_id --- src/http.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/http.rs b/src/http.rs index b7171d1..933a9fe 100644 --- a/src/http.rs +++ b/src/http.rs @@ -19,6 +19,10 @@ pub struct HTTP { app_name: String, sdk_version: &'static str, instance_id: String, + // The connection_id represents a logical connection from the SDK to Unleash. + // It's assigned internally by the SDK and lives as long as the Unleash client instance. + // We can't reuse instance_id since some SDKs allow to override it while + // connection_id has to be uniquely defined by the SDK. connection_id: String, authorization: Option, client: C, From 020662439f12a74a8e1d827d4fd6f77a493f1bbe Mon Sep 17 00:00:00 2001 From: kwasniew Date: Tue, 4 Feb 2025 11:24:44 +0100 Subject: [PATCH 18/21] chore: upgrade msrc version to 1.60.3 --- .github/workflows/ci-matrix.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-matrix.yml b/.github/workflows/ci-matrix.yml index a119db5..733b80e 100644 --- a/.github/workflows/ci-matrix.yml +++ b/.github/workflows/ci-matrix.yml @@ -82,7 +82,7 @@ jobs: strategy: matrix: rust: - - 1.60.0 # MSRV + - 1.60.3 # MSRV steps: - uses: actions/checkout@v2 From 440dd8a638fcb81f800ec59b65eba60aef46563e Mon Sep 17 00:00:00 2001 From: kwasniew Date: Tue, 4 Feb 2025 11:33:37 +0100 Subject: [PATCH 19/21] chore: upgrade msrc version to 1.61.0 --- .github/workflows/ci-matrix.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-matrix.yml b/.github/workflows/ci-matrix.yml index 733b80e..377233e 100644 --- a/.github/workflows/ci-matrix.yml +++ b/.github/workflows/ci-matrix.yml @@ -82,7 +82,7 @@ jobs: strategy: matrix: rust: - - 1.60.3 # MSRV + - 1.61.0 # MSRV steps: - uses: actions/checkout@v2 From 437229a65cbcc1e5613da090b23871bb91783001 Mon Sep 17 00:00:00 2001 From: kwasniew Date: Tue, 4 Feb 2025 11:38:39 +0100 Subject: [PATCH 20/21] chore: upgrade msrc version to 1.63.0 --- .github/workflows/ci-matrix.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-matrix.yml b/.github/workflows/ci-matrix.yml index 377233e..6db6788 100644 --- a/.github/workflows/ci-matrix.yml +++ b/.github/workflows/ci-matrix.yml @@ -82,7 +82,7 @@ jobs: strategy: matrix: rust: - - 1.61.0 # MSRV + - 1.63.0 # MSRV steps: - uses: actions/checkout@v2 From 5375b1448486a8ac07ca3a9fbf659a1956d31e44 Mon Sep 17 00:00:00 2001 From: kwasniew Date: Tue, 4 Feb 2025 11:49:02 +0100 Subject: [PATCH 21/21] chore: remove transitive dep from explicit deps --- Cargo.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index c6552ea..4529b7b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -55,7 +55,6 @@ enum-map = "~2.0.1" futures-timer = "3.0.2" hostname = "0.3.1" ipnet = "2.3.1" -libc = "0.2.146" log = "0.4.14" murmur3 = "0.5.1" rand = "0.8.4"