@@ -904,26 +904,44 @@ impl FromStr for NetAddress {
904
904
let port: u16 = addr. port ( ) ;
905
905
match addr {
906
906
SocketAddr :: V4 ( addr) => {
907
- let addr = addr. ip ( ) . to_string ( ) . parse :: < Ipv4Addr > ( ) ? ;
908
- return Ok ( NetAddress :: IPv4 { addr : addr . octets ( ) , port } ) ;
907
+ let addr = addr. ip ( ) . octets ( ) ;
908
+ return Ok ( NetAddress :: IPv4 { addr, port } ) ;
909
909
} ,
910
910
SocketAddr :: V6 ( addr) => {
911
- let addr = addr. ip ( ) . to_string ( ) . parse :: < Ipv6Addr > ( ) ? ;
912
- return Ok ( NetAddress :: IPv6 { addr : addr . octets ( ) , port } ) ;
911
+ let addr = addr. ip ( ) . octets ( ) ;
912
+ return Ok ( NetAddress :: IPv6 { addr, port } ) ;
913
913
} ,
914
914
}
915
915
} ,
916
916
Err ( e) => {
917
- let trimmed_input = s. rfind ( ":" ) . expect ( "Invalid input, needs to include seperator \" :\" " ) ;
917
+ let trimmed_input = match s. rfind ( ":" ) {
918
+ Some ( pos) => pos,
919
+ None => return Err ( e) ,
920
+ } ;
918
921
let host = & s[ ..trimmed_input] ;
919
- let port: u16 = s[ trimmed_input + 1 ..] . parse ( ) . expect ( "Invalid input, port needs to be u16" ) ;
922
+ let port: u16 = match s[ trimmed_input + 1 ..] . parse ( ) {
923
+ Ok ( port) => port,
924
+ Err ( _) => return Err ( e) ,
925
+ } ;
920
926
if host. ends_with ( ".onion" ) {
921
- let onion = host. split ( ".onion" ) . collect :: < Vec < & str > > ( ) [ 0 ] ;
922
- let onion = base32:: decode ( base32:: Alphabet :: RFC4648 { padding : false } , & onion) . expect ( "Error decoding onion address" ) ;
923
- let version = onion[ 0 ] ;
927
+ let onion = match host. split ( ".onion" ) . nth ( 0 ) {
928
+ Some ( onion) => onion,
929
+ None => return Err ( e) ,
930
+ } ;
931
+ let onion = match base32:: decode ( base32:: Alphabet :: RFC4648 { padding : false } , & onion) {
932
+ Some ( onion) => onion,
933
+ None => return Err ( e) ,
934
+ } ;
935
+ let version = match onion. get ( 0 ) {
936
+ Some ( version) => version,
937
+ None => return Err ( e) ,
938
+ } ;
924
939
let checksum = u16:: from_be_bytes ( [ onion[ 1 ] , onion[ 2 ] ] ) ;
925
- let ed25519_pubkey = onion[ 3 ..35 ] . try_into ( ) . expect ( "Invalid onion address" ) ;
926
- return Ok ( NetAddress :: OnionV3 { ed25519_pubkey, checksum, version, port } ) ;
940
+ let ed25519_pubkey = match onion[ 3 ..35 ] . try_into ( ) {
941
+ Ok ( ed25519_pubkey) => ed25519_pubkey,
942
+ Err ( _) => return Err ( e) ,
943
+ } ;
944
+ return Ok ( NetAddress :: OnionV3 { ed25519_pubkey, checksum, version : * version, port } ) ;
927
945
}
928
946
929
947
if let Ok ( hostname) = Hostname :: try_from ( host. to_string ( ) ) {
0 commit comments