From ec5f4bdb2ea650d45b1fb772b98d20dd38d8c718 Mon Sep 17 00:00:00 2001 From: Dirkjan Ochtman Date: Tue, 5 Dec 2023 17:33:58 +0100 Subject: [PATCH 1/3] Allow TryFrom<&str> for ServerName::IpAddress without std --- src/server_name.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/server_name.rs b/src/server_name.rs index 1baa3bf..1b08c1c 100644 --- a/src/server_name.rs +++ b/src/server_name.rs @@ -91,13 +91,10 @@ impl<'a> TryFrom<&'a str> for ServerName<'a> { fn try_from(s: &'a str) -> Result { match DnsName::try_from(s) { Ok(dns) => Ok(Self::DnsName(dns)), - #[cfg(feature = "std")] Err(InvalidDnsNameError) => match IpAddr::try_from(s) { Ok(ip) => Ok(Self::IpAddress(ip)), Err(_) => Err(InvalidDnsNameError), }, - #[cfg(not(feature = "std"))] - Err(InvalidDnsNameError) => Err(InvalidDnsNameError), } } } From a76c79a0156b565cd918ba2405d9d877f04b36f0 Mon Sep 17 00:00:00 2001 From: Dirkjan Ochtman Date: Tue, 5 Dec 2023 17:37:07 +0100 Subject: [PATCH 2/3] Add a TryFrom for ServerName<'static> impl --- src/server_name.rs | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/src/server_name.rs b/src/server_name.rs index 1b08c1c..2f9f847 100644 --- a/src/server_name.rs +++ b/src/server_name.rs @@ -23,6 +23,18 @@ use std::error::Error as StdError; /// ``` /// # use rustls_pki_types::ServerName; /// ServerName::try_from("example.com").expect("invalid DNS name"); +/// ``` +/// +/// If you have an owned `String`, you can use `TryFrom` directly: +/// +/// ``` +/// # use rustls_pki_types::ServerName; +/// let name = "example.com".to_string(); +/// #[cfg(feature = "alloc")] +/// ServerName::try_from(name).expect("invalid DNS name"); +/// ``` +/// +/// which will yield a `ServerName<'static>` if successful. /// /// // or, alternatively... /// @@ -74,6 +86,21 @@ impl<'a> fmt::Debug for ServerName<'a> { } } +#[cfg(feature = "alloc")] +impl TryFrom for ServerName<'static> { + type Error = InvalidDnsNameError; + + fn try_from(value: String) -> Result { + match DnsName::try_from_string(value) { + Ok(dns) => Ok(Self::DnsName(dns)), + Err(value) => match IpAddr::try_from(value.as_str()) { + Ok(ip) => Ok(Self::IpAddress(ip)), + Err(_) => Err(InvalidDnsNameError), + }, + } + } +} + impl<'a> TryFrom<&'a [u8]> for ServerName<'a> { type Error = InvalidDnsNameError; @@ -129,6 +156,14 @@ impl<'a> DnsName<'a> { Self(DnsNameInner::Owned(s)) => s.clone(), })) } + + #[cfg(feature = "alloc")] + fn try_from_string(s: String) -> Result { + match validate(s.as_bytes()) { + Ok(_) => Ok(Self(DnsNameInner::Owned(s))), + Err(_) => Err(s), + } + } } #[cfg(feature = "alloc")] @@ -136,8 +171,7 @@ impl TryFrom for DnsName<'static> { type Error = InvalidDnsNameError; fn try_from(value: String) -> Result { - validate(value.as_bytes())?; - Ok(Self(DnsNameInner::Owned(value))) + Self::try_from_string(value).map_err(|_| InvalidDnsNameError) } } From 77169b5b1db9bb022d4d197e39b5ca9649f7e7a1 Mon Sep 17 00:00:00 2001 From: Dirkjan Ochtman Date: Tue, 5 Dec 2023 18:24:13 +0100 Subject: [PATCH 3/3] Bump version number to 1.0.1 --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 3e9f130..256bfbe 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustls-pki-types" -version = "1.0.0" +version = "1.0.1" edition = "2021" rust-version = "1.60" license = "MIT OR Apache-2.0"