@@ -4,6 +4,7 @@ use std::time::Duration;
44use aquatic_udp_protocol:: TransactionId ;
55use hex_literal:: hex;
66use serde:: Serialize ;
7+ use url:: Url ;
78
89use crate :: console:: clients:: udp:: checker:: Client ;
910use crate :: console:: clients:: udp:: Error ;
@@ -23,20 +24,22 @@ pub enum Check {
2324}
2425
2526#[ allow( clippy:: missing_panics_doc) ]
26- pub async fn run ( udp_trackers : Vec < SocketAddr > , timeout : Duration ) -> Vec < Result < Checks , Checks > > {
27+ pub async fn run ( udp_trackers : Vec < Url > , timeout : Duration ) -> Vec < Result < Checks , Checks > > {
2728 let mut results = Vec :: default ( ) ;
2829
2930 tracing:: debug!( "UDP trackers ..." ) ;
3031
3132 let info_hash = aquatic_udp_protocol:: InfoHash ( hex ! ( "9c38422213e30bff212b30c360d26f9a02136422" ) ) ; // # DevSkim: ignore DS173237
3233
33- for remote_addr in udp_trackers {
34+ for remote_url in udp_trackers {
35+ let remote_addr = resolve_socket_addr ( & remote_url) ;
36+
3437 let mut checks = Checks {
3538 remote_addr,
3639 results : Vec :: default ( ) ,
3740 } ;
3841
39- tracing:: debug!( "UDP tracker: {:?}" , remote_addr ) ;
42+ tracing:: debug!( "UDP tracker: {:?}" , remote_url ) ;
4043
4144 // Setup
4245 let client = match Client :: new ( remote_addr, timeout) . await {
@@ -83,7 +86,7 @@ pub async fn run(udp_trackers: Vec<SocketAddr>, timeout: Duration) -> Vec<Result
8386 . await
8487 . map ( |_| ( ) ) ;
8588
86- checks. results . push ( ( Check :: Announce , check) ) ;
89+ checks. results . push ( ( Check :: Scrape , check) ) ;
8790 }
8891
8992 if checks. results . iter ( ) . any ( |f| f. 1 . is_err ( ) ) {
@@ -95,3 +98,37 @@ pub async fn run(udp_trackers: Vec<SocketAddr>, timeout: Duration) -> Vec<Result
9598
9699 results
97100}
101+
102+ fn resolve_socket_addr ( url : & Url ) -> SocketAddr {
103+ let socket_addr = url. socket_addrs ( || None ) . unwrap ( ) ;
104+ * socket_addr. first ( ) . unwrap ( )
105+ }
106+
107+ #[ cfg( test) ]
108+ mod tests {
109+ use std:: net:: { IpAddr , Ipv4Addr , Ipv6Addr , SocketAddr } ;
110+
111+ use url:: Url ;
112+
113+ use crate :: console:: clients:: checker:: checks:: udp:: resolve_socket_addr;
114+
115+ #[ test]
116+ fn it_should_resolve_the_socket_address_for_udp_scheme_urls_containing_a_domain ( ) {
117+ let socket_addr = resolve_socket_addr ( & Url :: parse ( "udp://localhost:8080" ) . unwrap ( ) ) ;
118+
119+ assert ! (
120+ socket_addr == SocketAddr :: new( IpAddr :: V4 ( Ipv4Addr :: new( 127 , 0 , 0 , 1 ) ) , 8080 )
121+ || socket_addr == SocketAddr :: new( IpAddr :: V6 ( Ipv6Addr :: new( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ) ) , 8080 )
122+ ) ;
123+ }
124+
125+ #[ test]
126+ fn it_should_resolve_the_socket_address_for_udp_scheme_urls_containing_an_ip ( ) {
127+ let socket_addr = resolve_socket_addr ( & Url :: parse ( "udp://localhost:8080" ) . unwrap ( ) ) ;
128+
129+ assert ! (
130+ socket_addr == SocketAddr :: new( IpAddr :: V4 ( Ipv4Addr :: new( 127 , 0 , 0 , 1 ) ) , 8080 )
131+ || socket_addr == SocketAddr :: new( IpAddr :: V6 ( Ipv6Addr :: new( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ) ) , 8080 )
132+ ) ;
133+ }
134+ }
0 commit comments