@@ -42,7 +42,7 @@ use rand::{Rng, SeedableRng};
42
42
use rand_chacha:: ChaChaRng ;
43
43
use serde:: { Deserialize , Serialize } ;
44
44
use std:: {
45
- net:: SocketAddr ,
45
+ net:: { SocketAddr , ToSocketAddrs } ,
46
46
path:: PathBuf ,
47
47
sync:: { Arc , atomic:: AtomicBool } ,
48
48
} ;
@@ -228,11 +228,14 @@ impl Start {
228
228
false => Ok ( self
229
229
. peers
230
230
. split ( ',' )
231
- . flat_map ( |ip| match ip. parse :: < SocketAddr > ( ) {
232
- Ok ( ip) => Some ( ip) ,
233
- Err ( e) => {
234
- eprintln ! ( "The IP supplied to --peers ('{ip}') is malformed: {e}" ) ;
235
- None
231
+ . flat_map ( |ip_or_hostname| {
232
+ let trimmed = ip_or_hostname. trim ( ) ;
233
+ match trimmed. to_socket_addrs ( ) {
234
+ Ok ( mut addr) => addr. next ( ) ,
235
+ Err ( e) => {
236
+ eprintln ! ( "The hostname or IP supplied to --peers ('{trimmed}') is malformed: {e}" ) ;
237
+ None
238
+ }
236
239
}
237
240
} )
238
241
. collect ( ) ) ,
@@ -1039,4 +1042,60 @@ mod tests {
1039
1042
panic ! ( "Unexpected result of clap parsing!" ) ;
1040
1043
}
1041
1044
}
1045
+
1046
+ #[ test]
1047
+ fn parse_peers_when_ips ( ) {
1048
+ let arg_vec = vec ! [ "snarkos" , "start" , "--peers" , "127.0.0.1:3030,127.0.0.2:3030" ] ;
1049
+ let cli = CLI :: parse_from ( arg_vec) ;
1050
+
1051
+ if let Command :: Start ( start) = cli. command {
1052
+ let peers = start. parse_trusted_peers ( ) ;
1053
+ assert ! ( peers. is_ok( ) ) ;
1054
+ assert ! ( peers. unwrap( ) . len( ) == 2 , "Expected two peers" ) ;
1055
+ } else {
1056
+ panic ! ( "Unexpected result of clap parsing!" ) ;
1057
+ }
1058
+ }
1059
+
1060
+ #[ test]
1061
+ fn parse_peers_when_hostnames ( ) {
1062
+ let arg_vec = vec ! [ "snarkos" , "start" , "--peers" , "www.example.com:4130,www.google.com:4130" ] ;
1063
+ let cli = CLI :: parse_from ( arg_vec) ;
1064
+
1065
+ if let Command :: Start ( start) = cli. command {
1066
+ let peers = start. parse_trusted_peers ( ) ;
1067
+ assert ! ( peers. is_ok( ) ) ;
1068
+ assert ! ( peers. unwrap( ) . len( ) == 2 , "Expected two peers" ) ;
1069
+ } else {
1070
+ panic ! ( "Unexpected result of clap parsing!" ) ;
1071
+ }
1072
+ }
1073
+
1074
+ #[ test]
1075
+ fn parse_peers_when_mixed_and_with_whitespaces ( ) {
1076
+ let arg_vec = vec ! [ "snarkos" , "start" , "--peers" , " 127.0.0.1:3030, www.google.com:4130 " ] ;
1077
+ let cli = CLI :: parse_from ( arg_vec) ;
1078
+
1079
+ if let Command :: Start ( start) = cli. command {
1080
+ let peers = start. parse_trusted_peers ( ) ;
1081
+ assert ! ( peers. is_ok( ) ) ;
1082
+ assert ! ( peers. unwrap( ) . len( ) == 2 , "Expected two peers" ) ;
1083
+ } else {
1084
+ panic ! ( "Unexpected result of clap parsing!" ) ;
1085
+ }
1086
+ }
1087
+
1088
+ #[ test]
1089
+ fn parse_peers_when_unknown_hostname_gracefully ( ) {
1090
+ let arg_vec = vec ! [ "snarkos" , "start" , "--peers" , "banana.cake.eafafdaeefasdfasd.com" ] ;
1091
+ let cli = CLI :: parse_from ( arg_vec) ;
1092
+
1093
+ if let Command :: Start ( start) = cli. command {
1094
+ let peers = start. parse_trusted_peers ( ) ;
1095
+ assert ! ( peers. is_ok( ) ) ;
1096
+ assert ! ( peers. unwrap( ) . len( ) == 0 , "Expected zero peers" ) ;
1097
+ } else {
1098
+ panic ! ( "Unexpected result of clap parsing!" ) ;
1099
+ }
1100
+ }
1042
1101
}
0 commit comments