@@ -4,6 +4,7 @@ use std::time::Duration;
4
4
use aquatic_udp_protocol:: TransactionId ;
5
5
use hex_literal:: hex;
6
6
use serde:: Serialize ;
7
+ use url:: Url ;
7
8
8
9
use crate :: console:: clients:: udp:: checker:: Client ;
9
10
use crate :: console:: clients:: udp:: Error ;
@@ -23,20 +24,22 @@ pub enum Check {
23
24
}
24
25
25
26
#[ 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 > > {
27
28
let mut results = Vec :: default ( ) ;
28
29
29
30
tracing:: debug!( "UDP trackers ..." ) ;
30
31
31
32
let info_hash = aquatic_udp_protocol:: InfoHash ( hex ! ( "9c38422213e30bff212b30c360d26f9a02136422" ) ) ; // # DevSkim: ignore DS173237
32
33
33
- for remote_addr in udp_trackers {
34
+ for remote_url in udp_trackers {
35
+ let remote_addr = resolve_socket_addr ( & remote_url) ;
36
+
34
37
let mut checks = Checks {
35
38
remote_addr,
36
39
results : Vec :: default ( ) ,
37
40
} ;
38
41
39
- tracing:: debug!( "UDP tracker: {:?}" , remote_addr ) ;
42
+ tracing:: debug!( "UDP tracker: {:?}" , remote_url ) ;
40
43
41
44
// Setup
42
45
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
83
86
. await
84
87
. map ( |_| ( ) ) ;
85
88
86
- checks. results . push ( ( Check :: Announce , check) ) ;
89
+ checks. results . push ( ( Check :: Scrape , check) ) ;
87
90
}
88
91
89
92
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
95
98
96
99
results
97
100
}
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