@@ -638,22 +638,29 @@ impl Readable for NetAddress {
638
638
}
639
639
}
640
640
641
+ fn rem_first_and_last ( value : & str ) -> & str {
642
+ let mut chars = value. chars ( ) ;
643
+ chars. next ( ) ;
644
+ chars. next_back ( ) ;
645
+ chars. as_str ( )
646
+ }
647
+
641
648
impl FromStr for NetAddress {
642
649
type Err = AddrParseError ;
643
650
644
651
fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
645
- let host: String = s. split ( "@" ) . collect :: < Vec < & str > > ( ) [ 0 ] . parse ( ) . expect ( "Invalid hostname" ) ;
646
- let port: u16 = s. split ( "@" ) . collect :: < Vec < & str > > ( ) [ 1 ] . parse ( ) . expect ( "Invalid port" ) ;
652
+ let trim_s_by_latest_colon = s. rfind ( ":" ) . unwrap ( ) ;
653
+ let host = & s[ ..trim_s_by_latest_colon] ;
654
+ let port: u16 = s[ trim_s_by_latest_colon + 1 ..] . parse ( ) . expect ( "Invalid port" ) ;
647
655
if let Ok ( addr) = host. parse :: < Ipv4Addr > ( ) {
648
656
let addr = SocketAddrV4 :: new ( addr, port) ;
649
657
return Ok ( NetAddress :: IPv4 { addr : addr. ip ( ) . octets ( ) , port } ) ;
650
658
}
651
- if let Ok ( addr) = host. parse :: < Ipv6Addr > ( ) {
659
+ if let Ok ( addr) = rem_first_and_last ( host) . parse :: < Ipv6Addr > ( ) {
652
660
let addr = SocketAddrV6 :: new ( addr, port, 0 , 0 ) ;
653
661
return Ok ( NetAddress :: IPv6 { addr : addr. ip ( ) . octets ( ) , port } ) ;
654
662
} ;
655
663
if host. ends_with ( ".onion" ) {
656
- // tests are failing
657
664
let onion = host. split ( ".onion" ) . collect :: < Vec < & str > > ( ) [ 0 ] ;
658
665
let onion = base32:: decode ( base32:: Alphabet :: RFC4648 { padding : false } , & onion) . expect ( "error in onion" ) ;
659
666
let version = onion[ 0 ] ;
@@ -662,7 +669,7 @@ impl FromStr for NetAddress {
662
669
return Ok ( NetAddress :: OnionV3 { ed25519_pubkey, checksum, version, port } ) ;
663
670
}
664
671
665
- if let Ok ( hostname) = Hostname :: try_from ( host) {
672
+ if let Ok ( hostname) = Hostname :: try_from ( host. to_string ( ) ) {
666
673
return Ok ( NetAddress :: Hostname { hostname, port } ) ;
667
674
}
668
675
@@ -3036,7 +3043,7 @@ mod tests {
3036
3043
} ) ;
3037
3044
}
3038
3045
Ok ( encoded_payload)
3039
- }
3046
+ }
3040
3047
3041
3048
#[ test]
3042
3049
fn net_address_from_str ( ) {
@@ -3053,15 +3060,16 @@ mod tests {
3053
3060
port : 1234 ,
3054
3061
} ;
3055
3062
let onionv3_net_address = NetAddress :: OnionV3 {
3056
- port : 1234 ,
3057
- ed25519_pubkey : [ 0xab ; 32 ] ,
3058
- checksum : 0x1234 ,
3059
- version : 0x03 ,
3063
+ ed25519_pubkey : [ 37 , 24 , 75 , 5 , 25 , 73 , 117 , 194 , 139 , 102 , 182 , 107 , 4 , 105 , 247 , 246 , 85 ,
3064
+ 111 , 177 , 172 , 49 , 137 , 167 , 155 , 64 , 221 , 163 , 47 , 31 , 33 , 71 , 3 ] ,
3065
+ checksum : 48326 ,
3066
+ version : 121 ,
3067
+ port : 1234
3060
3068
} ;
3061
- let valid_ipv4 = "127.0.0.1@ 1234" ;
3062
- let valid_ipv6 = "0:0:0:0:0:0:0:1@ 1234" ;
3063
- let valid_hostname = "example.com@ 1234" ;
3064
- let valid_onionv3 = "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789 .onion@ 1234" ;
3069
+ let valid_ipv4 = "127.0.0.1: 1234" ;
3070
+ let valid_ipv6 = "[ 0:0:0:0:0:0:0:1]: 1234" ;
3071
+ let valid_hostname = "example.com: 1234" ;
3072
+ let valid_onionv3 = "pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd .onion: 1234" ;
3065
3073
let result_ipv4 = NetAddress :: from_str ( valid_ipv4) . unwrap ( ) ;
3066
3074
let result_ipv6 = NetAddress :: from_str ( valid_ipv6) . unwrap ( ) ;
3067
3075
let result_hostname = NetAddress :: from_str ( valid_hostname) . unwrap ( ) ;
0 commit comments