@@ -661,22 +661,29 @@ impl Readable for NetAddress {
661
661
}
662
662
}
663
663
664
+ fn rem_first_and_last ( value : & str ) -> & str {
665
+ let mut chars = value. chars ( ) ;
666
+ chars. next ( ) ;
667
+ chars. next_back ( ) ;
668
+ chars. as_str ( )
669
+ }
670
+
664
671
impl FromStr for NetAddress {
665
672
type Err = AddrParseError ;
666
673
667
674
fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
668
- let host: String = s. split ( "@" ) . collect :: < Vec < & str > > ( ) [ 0 ] . parse ( ) . expect ( "Invalid hostname" ) ;
669
- let port: u16 = s. split ( "@" ) . collect :: < Vec < & str > > ( ) [ 1 ] . parse ( ) . expect ( "Invalid port" ) ;
675
+ let trim_s_by_latest_colon = s. rfind ( ":" ) . unwrap ( ) ;
676
+ let host = & s[ ..trim_s_by_latest_colon] ;
677
+ let port: u16 = s[ trim_s_by_latest_colon + 1 ..] . parse ( ) . expect ( "Invalid port" ) ;
670
678
if let Ok ( addr) = host. parse :: < Ipv4Addr > ( ) {
671
679
let addr = SocketAddrV4 :: new ( addr, port) ;
672
680
return Ok ( NetAddress :: IPv4 { addr : addr. ip ( ) . octets ( ) , port } ) ;
673
681
}
674
- if let Ok ( addr) = host. parse :: < Ipv6Addr > ( ) {
682
+ if let Ok ( addr) = rem_first_and_last ( host) . parse :: < Ipv6Addr > ( ) {
675
683
let addr = SocketAddrV6 :: new ( addr, port, 0 , 0 ) ;
676
684
return Ok ( NetAddress :: IPv6 { addr : addr. ip ( ) . octets ( ) , port } ) ;
677
685
} ;
678
686
if host. ends_with ( ".onion" ) {
679
- // tests are failing
680
687
let onion = host. split ( ".onion" ) . collect :: < Vec < & str > > ( ) [ 0 ] ;
681
688
let onion = base32:: decode ( base32:: Alphabet :: RFC4648 { padding : false } , & onion) . expect ( "error in onion" ) ;
682
689
let version = onion[ 0 ] ;
@@ -685,7 +692,7 @@ impl FromStr for NetAddress {
685
692
return Ok ( NetAddress :: OnionV3 { ed25519_pubkey, checksum, version, port } ) ;
686
693
}
687
694
688
- if let Ok ( hostname) = Hostname :: try_from ( host) {
695
+ if let Ok ( hostname) = Hostname :: try_from ( host. to_string ( ) ) {
689
696
return Ok ( NetAddress :: Hostname { hostname, port } ) ;
690
697
}
691
698
@@ -3142,7 +3149,7 @@ mod tests {
3142
3149
} ) ;
3143
3150
}
3144
3151
Ok ( encoded_payload)
3145
- }
3152
+ }
3146
3153
3147
3154
#[ test]
3148
3155
fn net_address_from_str ( ) {
@@ -3159,15 +3166,16 @@ mod tests {
3159
3166
port : 1234 ,
3160
3167
} ;
3161
3168
let onionv3_net_address = NetAddress :: OnionV3 {
3162
- port : 1234 ,
3163
- ed25519_pubkey : [ 0xab ; 32 ] ,
3164
- checksum : 0x1234 ,
3165
- version : 0x03 ,
3169
+ ed25519_pubkey : [ 37 , 24 , 75 , 5 , 25 , 73 , 117 , 194 , 139 , 102 , 182 , 107 , 4 , 105 , 247 , 246 , 85 ,
3170
+ 111 , 177 , 172 , 49 , 137 , 167 , 155 , 64 , 221 , 163 , 47 , 31 , 33 , 71 , 3 ] ,
3171
+ checksum : 48326 ,
3172
+ version : 121 ,
3173
+ port : 1234
3166
3174
} ;
3167
- let valid_ipv4 = "127.0.0.1@ 1234" ;
3168
- let valid_ipv6 = "0:0:0:0:0:0:0:1@ 1234" ;
3169
- let valid_hostname = "example.com@ 1234" ;
3170
- let valid_onionv3 = "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789 .onion@ 1234" ;
3175
+ let valid_ipv4 = "127.0.0.1: 1234" ;
3176
+ let valid_ipv6 = "[ 0:0:0:0:0:0:0:1]: 1234" ;
3177
+ let valid_hostname = "example.com: 1234" ;
3178
+ let valid_onionv3 = "pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd .onion: 1234" ;
3171
3179
let result_ipv4 = NetAddress :: from_str ( valid_ipv4) . unwrap ( ) ;
3172
3180
let result_ipv6 = NetAddress :: from_str ( valid_ipv6) . unwrap ( ) ;
3173
3181
let result_hostname = NetAddress :: from_str ( valid_hostname) . unwrap ( ) ;
0 commit comments