From 09561b63bf2aed495f7acc3cd44e37a17e9bcb5f Mon Sep 17 00:00:00 2001 From: jmcph4 Date: Tue, 5 Sep 2023 13:42:29 +1000 Subject: [PATCH 1/4] Add conversion from TCP socket address --- src/lib.rs | 15 ++++++++++++++- tests/lib.rs | 32 +++++++++++++++++++++++++++++++- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 92a31fb..032c265 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -20,7 +20,7 @@ use std::{ convert::TryFrom, fmt, io, iter::FromIterator, - net::{IpAddr, Ipv4Addr, Ipv6Addr}, + net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}, result::Result as StdResult, str::FromStr, sync::Arc, @@ -478,3 +478,16 @@ macro_rules! multiaddr { } } } + +impl From for Multiaddr { + fn from(socket: SocketAddr) -> Self { + match socket { + SocketAddr::V4(sock) => Self::empty() + .with(Protocol::Ip4(*sock.ip())) + .with(Protocol::Tcp(sock.port())), + SocketAddr::V6(sock) => Self::empty() + .with(Protocol::Ip6(*sock.ip())) + .with(Protocol::Tcp(sock.port())), + } + } +} diff --git a/tests/lib.rs b/tests/lib.rs index 071a4ce..2e79059 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -7,7 +7,7 @@ use std::{ borrow::Cow, convert::{TryFrom, TryInto}, iter::{self, FromIterator}, - net::{Ipv4Addr, Ipv6Addr}, + net::{Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6}, str::FromStr, }; @@ -661,3 +661,33 @@ fn arbitrary_impl_for_all_proto_variants() { let variants = core::mem::variant_count::() as u8; assert_eq!(variants, Proto::IMPL_VARIANT_COUNT); } + +#[test] +fn from_ipv4_socket() { + let socket_addr: SocketAddr = + SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(127, 0, 0, 1), 80)); + let expected_multiaddr: Multiaddr = Multiaddr::empty() + .with(Protocol::Ip4(Ipv4Addr::new(127, 0, 0, 1))) + .with(Protocol::Tcp(80)); + + let actual_multiaddr: Multiaddr = socket_addr.into(); + + assert_eq!(actual_multiaddr, expected_multiaddr); +} + +#[test] +fn from_ipv6_socket() { + let socket_addr: SocketAddr = SocketAddr::V6(SocketAddrV6::new( + Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1), + 80, + 0, + 0, + )); + let expected_multiaddr: Multiaddr = Multiaddr::empty() + .with(Protocol::Ip6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1))) + .with(Protocol::Tcp(80)); + + let actual_multiaddr: Multiaddr = socket_addr.into(); + + assert_eq!(actual_multiaddr, expected_multiaddr); +} From 30504e4de3a9777481b5969c554912c8932fa279 Mon Sep 17 00:00:00 2001 From: jmcph4 Date: Tue, 5 Sep 2023 14:13:20 +1000 Subject: [PATCH 2/4] Add (fallible) conversion from multiaddr into TCP socket address --- src/lib.rs | 18 +++++++++++++++++- tests/lib.rs | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 032c265..aa3d371 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -20,7 +20,7 @@ use std::{ convert::TryFrom, fmt, io, iter::FromIterator, - net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}, + net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6}, result::Result as StdResult, str::FromStr, sync::Arc, @@ -491,3 +491,19 @@ impl From for Multiaddr { } } } + +impl TryInto for Multiaddr { + type Error = Error; + + fn try_into(self) -> Result { + match (self.iter().next(), self.iter().nth(1)) { + (Some(Protocol::Ip4(ip4)), Some(Protocol::Tcp(port))) => { + Ok(SocketAddr::V4(SocketAddrV4::new(ip4, port))) + } + (Some(Protocol::Ip6(ip6)), Some(Protocol::Tcp(port))) => { + Ok(SocketAddr::V6(SocketAddrV6::new(ip6, port, 0, 0))) + } + _ => Err(Error::InvalidMultiaddr), + } + } +} diff --git a/tests/lib.rs b/tests/lib.rs index 2e79059..0e54d39 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -691,3 +691,35 @@ fn from_ipv6_socket() { assert_eq!(actual_multiaddr, expected_multiaddr); } + +#[test] +fn into_ipv4_socket() { + let multiaddr: Multiaddr = Multiaddr::empty() + .with(Protocol::Ip4(Ipv4Addr::new(127, 0, 0, 1))) + .with(Protocol::Tcp(80)); + let expected_socket_addr: SocketAddr = + SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(127, 0, 0, 1), 80)); + + let actual_socket_addr: Result = multiaddr.try_into(); + + assert!(actual_socket_addr.is_ok()); + assert_eq!(actual_socket_addr.unwrap(), expected_socket_addr); +} + +#[test] +fn into_ipv6_socket() { + let multiaddr: Multiaddr = Multiaddr::empty() + .with(Protocol::Ip6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1))) + .with(Protocol::Tcp(80)); + let expected_socket_addr: SocketAddr = SocketAddr::V6(SocketAddrV6::new( + Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1), + 80, + 0, + 0, + )); + + let actual_socket_addr: Result = multiaddr.try_into(); + + assert!(actual_socket_addr.is_ok()); + assert_eq!(actual_socket_addr.unwrap(), expected_socket_addr); +} From 987f70344417c49682a1a7958adee999399208be Mon Sep 17 00:00:00 2001 From: jmcph4 Date: Wed, 6 Sep 2023 11:32:03 +1000 Subject: [PATCH 3/4] Add UDP conversion and switch to dedicated methods --- src/lib.rs | 24 ++++++++++++++++++++++++ tests/lib.rs | 40 ++++++++++++++++++++++++++++++++++++---- 2 files changed, 60 insertions(+), 4 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index aa3d371..7c16015 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -199,6 +199,30 @@ impl Multiaddr { pub fn protocol_stack(&self) -> ProtoStackIter { ProtoStackIter { parts: self.iter() } } + + pub fn into_tcp_socket(&self) -> Result { + match (self.iter().next(), self.iter().nth(1)) { + (Some(Protocol::Ip4(ip4)), Some(Protocol::Tcp(port))) => { + Ok(SocketAddr::V4(SocketAddrV4::new(ip4, port))) + } + (Some(Protocol::Ip6(ip6)), Some(Protocol::Tcp(port))) => { + Ok(SocketAddr::V6(SocketAddrV6::new(ip6, port, 0, 0))) + } + _ => Err(Error::InvalidMultiaddr), + } + } + + pub fn into_udp_socket(&self) -> Result { + match (self.iter().next(), self.iter().nth(1)) { + (Some(Protocol::Ip4(ip4)), Some(Protocol::Udp(port))) => { + Ok(SocketAddr::V4(SocketAddrV4::new(ip4, port))) + } + (Some(Protocol::Ip6(ip6)), Some(Protocol::Udp(port))) => { + Ok(SocketAddr::V6(SocketAddrV6::new(ip6, port, 0, 0))) + } + _ => Err(Error::InvalidMultiaddr), + } + } } impl fmt::Debug for Multiaddr { diff --git a/tests/lib.rs b/tests/lib.rs index 0e54d39..8c339fa 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -693,21 +693,21 @@ fn from_ipv6_socket() { } #[test] -fn into_ipv4_socket() { +fn into_ipv4_tcp_socket() { let multiaddr: Multiaddr = Multiaddr::empty() .with(Protocol::Ip4(Ipv4Addr::new(127, 0, 0, 1))) .with(Protocol::Tcp(80)); let expected_socket_addr: SocketAddr = SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(127, 0, 0, 1), 80)); - let actual_socket_addr: Result = multiaddr.try_into(); + let actual_socket_addr: Result = multiaddr.into_tcp_socket(); assert!(actual_socket_addr.is_ok()); assert_eq!(actual_socket_addr.unwrap(), expected_socket_addr); } #[test] -fn into_ipv6_socket() { +fn into_ipv6_tcp_socket() { let multiaddr: Multiaddr = Multiaddr::empty() .with(Protocol::Ip6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1))) .with(Protocol::Tcp(80)); @@ -718,7 +718,39 @@ fn into_ipv6_socket() { 0, )); - let actual_socket_addr: Result = multiaddr.try_into(); + let actual_socket_addr: Result = multiaddr.into_tcp_socket(); + + assert!(actual_socket_addr.is_ok()); + assert_eq!(actual_socket_addr.unwrap(), expected_socket_addr); +} + +#[test] +fn into_ipv4_udp_socket() { + let multiaddr: Multiaddr = Multiaddr::empty() + .with(Protocol::Ip4(Ipv4Addr::new(127, 0, 0, 1))) + .with(Protocol::Udp(80)); + let expected_socket_addr: SocketAddr = + SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(127, 0, 0, 1), 80)); + + let actual_socket_addr: Result = multiaddr.into_udp_socket(); + + assert!(actual_socket_addr.is_ok()); + assert_eq!(actual_socket_addr.unwrap(), expected_socket_addr); +} + +#[test] +fn into_ipv6_udp_socket() { + let multiaddr: Multiaddr = Multiaddr::empty() + .with(Protocol::Ip6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1))) + .with(Protocol::Udp(80)); + let expected_socket_addr: SocketAddr = SocketAddr::V6(SocketAddrV6::new( + Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1), + 80, + 0, + 0, + )); + + let actual_socket_addr: Result = multiaddr.into_udp_socket(); assert!(actual_socket_addr.is_ok()); assert_eq!(actual_socket_addr.unwrap(), expected_socket_addr); From 614c50efc5ad85ef3af875594e06ba94f444dca3 Mon Sep 17 00:00:00 2001 From: jmcph4 Date: Wed, 6 Sep 2023 11:32:53 +1000 Subject: [PATCH 4/4] Remove TryFrom impl --- src/lib.rs | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 7c16015..3d4fee5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -515,19 +515,3 @@ impl From for Multiaddr { } } } - -impl TryInto for Multiaddr { - type Error = Error; - - fn try_into(self) -> Result { - match (self.iter().next(), self.iter().nth(1)) { - (Some(Protocol::Ip4(ip4)), Some(Protocol::Tcp(port))) => { - Ok(SocketAddr::V4(SocketAddrV4::new(ip4, port))) - } - (Some(Protocol::Ip6(ip6)), Some(Protocol::Tcp(port))) => { - Ok(SocketAddr::V6(SocketAddrV6::new(ip6, port, 0, 0))) - } - _ => Err(Error::InvalidMultiaddr), - } - } -}