@@ -660,26 +660,44 @@ impl FromStr for NetAddress {
660
660
let port: u16 = addr. port ( ) ;
661
661
match addr {
662
662
SocketAddr :: V4 ( addr) => {
663
- let addr = addr. ip ( ) . to_string ( ) . parse :: < Ipv4Addr > ( ) ? ;
664
- return Ok ( NetAddress :: IPv4 { addr : addr . octets ( ) , port } ) ;
663
+ let addr = addr. ip ( ) . octets ( ) ;
664
+ return Ok ( NetAddress :: IPv4 { addr, port } ) ;
665
665
} ,
666
666
SocketAddr :: V6 ( addr) => {
667
- let addr = addr. ip ( ) . to_string ( ) . parse :: < Ipv6Addr > ( ) ? ;
668
- return Ok ( NetAddress :: IPv6 { addr : addr . octets ( ) , port } ) ;
667
+ let addr = addr. ip ( ) . octets ( ) ;
668
+ return Ok ( NetAddress :: IPv6 { addr, port } ) ;
669
669
} ,
670
670
}
671
671
} ,
672
672
Err ( e) => {
673
- let trimmed_input = s. rfind ( ":" ) . expect ( "Invalid input, needs to include seperator \" :\" " ) ;
673
+ let trimmed_input = match s. rfind ( ":" ) {
674
+ Some ( pos) => pos,
675
+ None => return Err ( e) ,
676
+ } ;
674
677
let host = & s[ ..trimmed_input] ;
675
- let port: u16 = s[ trimmed_input + 1 ..] . parse ( ) . expect ( "Invalid input, port needs to be u16" ) ;
678
+ let port: u16 = match s[ trimmed_input + 1 ..] . parse ( ) {
679
+ Ok ( port) => port,
680
+ Err ( _) => return Err ( e) ,
681
+ } ;
676
682
if host. ends_with ( ".onion" ) {
677
- let onion = host. split ( ".onion" ) . collect :: < Vec < & str > > ( ) [ 0 ] ;
678
- let onion = base32:: decode ( base32:: Alphabet :: RFC4648 { padding : false } , & onion) . expect ( "Error decoding onion address" ) ;
679
- let version = onion[ 0 ] ;
683
+ let onion = match host. split ( ".onion" ) . nth ( 0 ) {
684
+ Some ( onion) => onion,
685
+ None => return Err ( e) ,
686
+ } ;
687
+ let onion = match base32:: decode ( base32:: Alphabet :: RFC4648 { padding : false } , & onion) {
688
+ Some ( onion) => onion,
689
+ None => return Err ( e) ,
690
+ } ;
691
+ let version = match onion. get ( 0 ) {
692
+ Some ( version) => version,
693
+ None => return Err ( e) ,
694
+ } ;
680
695
let checksum = u16:: from_be_bytes ( [ onion[ 1 ] , onion[ 2 ] ] ) ;
681
- let ed25519_pubkey = onion[ 3 ..35 ] . try_into ( ) . expect ( "Invalid onion address" ) ;
682
- return Ok ( NetAddress :: OnionV3 { ed25519_pubkey, checksum, version, port } ) ;
696
+ let ed25519_pubkey = match onion[ 3 ..35 ] . try_into ( ) {
697
+ Ok ( ed25519_pubkey) => ed25519_pubkey,
698
+ Err ( _) => return Err ( e) ,
699
+ } ;
700
+ return Ok ( NetAddress :: OnionV3 { ed25519_pubkey, checksum, version : * version, port } ) ;
683
701
}
684
702
685
703
if let Ok ( hostname) = Hostname :: try_from ( host. to_string ( ) ) {
0 commit comments