Skip to content

Commit 0784a9e

Browse files
committed
feat: [torrust#1424] add ServiceBinding to UDP events
1 parent 8c44033 commit 0784a9e

File tree

15 files changed

+270
-108
lines changed

15 files changed

+270
-108
lines changed

packages/udp-tracker-core/benches/helpers/sync.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,23 @@ use std::time::{Duration, Instant};
44

55
use bittorrent_udp_tracker_core::services::connect::ConnectService;
66
use bittorrent_udp_tracker_core::statistics;
7+
use torrust_tracker_primitives::service_binding::{Protocol, ServiceBinding};
78

89
use crate::helpers::utils::{sample_ipv4_remote_addr, sample_issue_time};
910

1011
#[allow(clippy::unused_async)]
1112
pub async fn connect_once(samples: u64) -> Duration {
1213
let client_socket_addr = sample_ipv4_remote_addr();
1314
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969);
15+
let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap();
1416

1517
let (udp_core_stats_event_sender, _udp_core_stats_repository) = statistics::setup::factory(false);
1618
let udp_core_stats_event_sender = Arc::new(udp_core_stats_event_sender);
1719
let connect_service = Arc::new(ConnectService::new(udp_core_stats_event_sender));
1820
let start = Instant::now();
1921

2022
for _ in 0..samples {
21-
let _response = connect_service.handle_connect(client_socket_addr, server_socket_addr, sample_issue_time());
23+
let _response = connect_service.handle_connect(client_socket_addr, server_service_binding.clone(), sample_issue_time());
2224
}
2325

2426
start.elapsed()

packages/udp-tracker-core/src/event/mod.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use std::net::SocketAddr;
22

3+
use torrust_tracker_primitives::service_binding::ServiceBinding;
4+
35
pub mod sender;
46

57
/// A UDP core event.
@@ -13,15 +15,15 @@ pub enum Event {
1315
#[derive(Debug, PartialEq, Eq, Clone)]
1416
pub struct ConnectionContext {
1517
pub client_socket_addr: SocketAddr,
16-
pub server_socket_addr: SocketAddr,
18+
pub server_service_binding: ServiceBinding,
1719
}
1820

1921
impl ConnectionContext {
2022
#[must_use]
21-
pub fn new(client_socket_addr: SocketAddr, server_socket_addr: SocketAddr) -> Self {
23+
pub fn new(client_socket_addr: SocketAddr, server_service_binding: ServiceBinding) -> Self {
2224
Self {
2325
client_socket_addr,
24-
server_socket_addr,
26+
server_service_binding,
2527
}
2628
}
2729

@@ -32,6 +34,6 @@ impl ConnectionContext {
3234

3335
#[must_use]
3436
pub fn server_socket_addr(&self) -> SocketAddr {
35-
self.server_socket_addr
37+
self.server_service_binding.bind_address()
3638
}
3739
}

packages/udp-tracker-core/src/services/announce.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ use bittorrent_tracker_core::error::{AnnounceError, WhitelistError};
1818
use bittorrent_tracker_core::whitelist;
1919
use bittorrent_udp_tracker_protocol::peer_builder;
2020
use torrust_tracker_primitives::core::AnnounceData;
21+
use torrust_tracker_primitives::service_binding::ServiceBinding;
2122

2223
use crate::connection_cookie::{check, gen_remote_fingerprint, ConnectionCookieError};
2324
use crate::event::{self, ConnectionContext, Event};
@@ -58,7 +59,7 @@ impl AnnounceService {
5859
pub async fn handle_announce(
5960
&self,
6061
client_socket_addr: SocketAddr,
61-
server_socket_addr: SocketAddr,
62+
server_service_binding: ServiceBinding,
6263
request: &AnnounceRequest,
6364
cookie_valid_range: Range<f64>,
6465
) -> Result<AnnounceData, UdpAnnounceError> {
@@ -79,7 +80,7 @@ impl AnnounceService {
7980
.announce(&info_hash, &mut peer, &remote_client_ip, &peers_wanted)
8081
.await?;
8182

82-
self.send_event(client_socket_addr, server_socket_addr).await;
83+
self.send_event(client_socket_addr, server_service_binding).await;
8384

8485
Ok(announce_data)
8586
}
@@ -100,11 +101,11 @@ impl AnnounceService {
100101
self.whitelist_authorization.authorize(info_hash).await
101102
}
102103

103-
async fn send_event(&self, client_socket_addr: SocketAddr, server_socket_addr: SocketAddr) {
104+
async fn send_event(&self, client_socket_addr: SocketAddr, server_service_binding: ServiceBinding) {
104105
if let Some(udp_stats_event_sender) = self.opt_udp_core_stats_event_sender.as_deref() {
105106
udp_stats_event_sender
106107
.send_event(Event::UdpAnnounce {
107-
context: ConnectionContext::new(client_socket_addr, server_socket_addr),
108+
context: ConnectionContext::new(client_socket_addr, server_service_binding),
108109
})
109110
.await;
110111
}

packages/udp-tracker-core/src/services/connect.rs

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use std::net::SocketAddr;
55
use std::sync::Arc;
66

77
use aquatic_udp_protocol::ConnectionId;
8+
use torrust_tracker_primitives::service_binding::ServiceBinding;
89

910
use crate::connection_cookie::{gen_remote_fingerprint, make};
1011
use crate::event::{self, ConnectionContext, Event};
@@ -33,7 +34,7 @@ impl ConnectService {
3334
pub async fn handle_connect(
3435
&self,
3536
client_socket_addr: SocketAddr,
36-
server_socket_addr: SocketAddr,
37+
server_service_binding: ServiceBinding,
3738
cookie_issue_time: f64,
3839
) -> ConnectionId {
3940
let connection_id =
@@ -42,7 +43,7 @@ impl ConnectService {
4243
if let Some(udp_stats_event_sender) = self.opt_udp_core_stats_event_sender.as_deref() {
4344
udp_stats_event_sender
4445
.send_event(Event::UdpConnect {
45-
context: ConnectionContext::new(client_socket_addr, server_socket_addr),
46+
context: ConnectionContext::new(client_socket_addr, server_service_binding),
4647
})
4748
.await;
4849
}
@@ -61,6 +62,7 @@ mod tests {
6162
use std::sync::Arc;
6263

6364
use mockall::predicate::eq;
65+
use torrust_tracker_primitives::service_binding::{Protocol, ServiceBinding};
6466

6567
use crate::connection_cookie::make;
6668
use crate::event::{ConnectionContext, Event};
@@ -74,14 +76,15 @@ mod tests {
7476
#[tokio::test]
7577
async fn a_connect_response_should_contain_the_same_transaction_id_as_the_connect_request() {
7678
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969);
79+
let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap();
7780

7881
let (udp_core_stats_event_sender, _udp_core_stats_repository) = statistics::setup::factory(false);
7982
let udp_core_stats_event_sender = Arc::new(udp_core_stats_event_sender);
8083

8184
let connect_service = Arc::new(ConnectService::new(udp_core_stats_event_sender));
8285

8386
let response = connect_service
84-
.handle_connect(sample_ipv4_remote_addr(), server_socket_addr, sample_issue_time())
87+
.handle_connect(sample_ipv4_remote_addr(), server_service_binding, sample_issue_time())
8588
.await;
8689

8790
assert_eq!(
@@ -93,14 +96,15 @@ mod tests {
9396
#[tokio::test]
9497
async fn a_connect_response_should_contain_a_new_connection_id() {
9598
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969);
99+
let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap();
96100

97101
let (udp_core_stats_event_sender, _udp_core_stats_repository) = statistics::setup::factory(false);
98102
let udp_core_stats_event_sender = Arc::new(udp_core_stats_event_sender);
99103

100104
let connect_service = Arc::new(ConnectService::new(udp_core_stats_event_sender));
101105

102106
let response = connect_service
103-
.handle_connect(sample_ipv4_remote_addr(), server_socket_addr, sample_issue_time())
107+
.handle_connect(sample_ipv4_remote_addr(), server_service_binding, sample_issue_time())
104108
.await;
105109

106110
assert_eq!(
@@ -113,14 +117,15 @@ mod tests {
113117
async fn a_connect_response_should_contain_a_new_connection_id_ipv6() {
114118
let client_socket_addr = sample_ipv6_remote_addr();
115119
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969);
120+
let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap();
116121

117122
let (udp_core_stats_event_sender, _udp_core_stats_repository) = statistics::setup::factory(false);
118123
let udp_core_stats_event_sender = Arc::new(udp_core_stats_event_sender);
119124

120125
let connect_service = Arc::new(ConnectService::new(udp_core_stats_event_sender));
121126

122127
let response = connect_service
123-
.handle_connect(client_socket_addr, server_socket_addr, sample_issue_time())
128+
.handle_connect(client_socket_addr, server_service_binding, sample_issue_time())
124129
.await;
125130

126131
assert_eq!(
@@ -133,12 +138,13 @@ mod tests {
133138
async fn it_should_send_the_upd4_connect_event_when_a_client_tries_to_connect_using_a_ip4_socket_address() {
134139
let client_socket_addr = sample_ipv4_socket_address();
135140
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969);
141+
let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap();
136142

137143
let mut udp_stats_event_sender_mock = MockUdpCoreStatsEventSender::new();
138144
udp_stats_event_sender_mock
139145
.expect_send_event()
140146
.with(eq(Event::UdpConnect {
141-
context: ConnectionContext::new(client_socket_addr, server_socket_addr),
147+
context: ConnectionContext::new(client_socket_addr, server_service_binding.clone()),
142148
}))
143149
.times(1)
144150
.returning(|_| Box::pin(future::ready(Some(Ok(1)))));
@@ -148,20 +154,21 @@ mod tests {
148154
let connect_service = Arc::new(ConnectService::new(opt_udp_stats_event_sender));
149155

150156
connect_service
151-
.handle_connect(client_socket_addr, server_socket_addr, sample_issue_time())
157+
.handle_connect(client_socket_addr, server_service_binding, sample_issue_time())
152158
.await;
153159
}
154160

155161
#[tokio::test]
156162
async fn it_should_send_the_upd6_connect_event_when_a_client_tries_to_connect_using_a_ip6_socket_address() {
157163
let client_socket_addr = sample_ipv6_remote_addr();
158164
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969);
165+
let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap();
159166

160167
let mut udp_stats_event_sender_mock = MockUdpCoreStatsEventSender::new();
161168
udp_stats_event_sender_mock
162169
.expect_send_event()
163170
.with(eq(Event::UdpConnect {
164-
context: ConnectionContext::new(client_socket_addr, server_socket_addr),
171+
context: ConnectionContext::new(client_socket_addr, server_service_binding.clone()),
165172
}))
166173
.times(1)
167174
.returning(|_| Box::pin(future::ready(Some(Ok(1)))));
@@ -171,7 +178,7 @@ mod tests {
171178
let connect_service = Arc::new(ConnectService::new(opt_udp_stats_event_sender));
172179

173180
connect_service
174-
.handle_connect(client_socket_addr, server_socket_addr, sample_issue_time())
181+
.handle_connect(client_socket_addr, server_service_binding, sample_issue_time())
175182
.await;
176183
}
177184
}

packages/udp-tracker-core/src/services/scrape.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use bittorrent_primitives::info_hash::InfoHash;
1616
use bittorrent_tracker_core::error::{ScrapeError, WhitelistError};
1717
use bittorrent_tracker_core::scrape_handler::ScrapeHandler;
1818
use torrust_tracker_primitives::core::ScrapeData;
19+
use torrust_tracker_primitives::service_binding::ServiceBinding;
1920

2021
use crate::connection_cookie::{check, gen_remote_fingerprint, ConnectionCookieError};
2122
use crate::event::{self, ConnectionContext, Event};
@@ -50,7 +51,7 @@ impl ScrapeService {
5051
pub async fn handle_scrape(
5152
&self,
5253
client_socket_addr: SocketAddr,
53-
server_socket_addr: SocketAddr,
54+
server_service_binding: ServiceBinding,
5455
request: &ScrapeRequest,
5556
cookie_valid_range: Range<f64>,
5657
) -> Result<ScrapeData, UdpScrapeError> {
@@ -61,7 +62,7 @@ impl ScrapeService {
6162
.scrape(&Self::convert_from_aquatic(&request.info_hashes))
6263
.await?;
6364

64-
self.send_event(client_socket_addr, server_socket_addr).await;
65+
self.send_event(client_socket_addr, server_service_binding).await;
6566

6667
Ok(scrape_data)
6768
}
@@ -82,11 +83,11 @@ impl ScrapeService {
8283
aquatic_infohashes.iter().map(|&x| x.into()).collect()
8384
}
8485

85-
async fn send_event(&self, client_socket_addr: SocketAddr, server_socket_addr: SocketAddr) {
86+
async fn send_event(&self, client_socket_addr: SocketAddr, server_service_binding: ServiceBinding) {
8687
if let Some(udp_stats_event_sender) = self.opt_udp_stats_event_sender.as_deref() {
8788
udp_stats_event_sender
8889
.send_event(Event::UdpScrape {
89-
context: ConnectionContext::new(client_socket_addr, server_socket_addr),
90+
context: ConnectionContext::new(client_socket_addr, server_service_binding),
9091
})
9192
.await;
9293
}

packages/udp-tracker-core/src/statistics/event/handler.rs

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ pub async fn handle_event(event: Event, stats_repository: &Repository) {
3939
mod tests {
4040
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr};
4141

42+
use torrust_tracker_primitives::service_binding::{Protocol, ServiceBinding};
43+
4244
use crate::event::{ConnectionContext, Event};
4345
use crate::statistics::event::handler::handle_event;
4446
use crate::statistics::repository::Repository;
@@ -51,7 +53,11 @@ mod tests {
5153
Event::UdpConnect {
5254
context: ConnectionContext::new(
5355
SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 195)), 8080),
54-
SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969),
56+
ServiceBinding::new(
57+
Protocol::UDP,
58+
SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969),
59+
)
60+
.unwrap(),
5561
),
5662
},
5763
&stats_repository,
@@ -71,7 +77,11 @@ mod tests {
7177
Event::UdpAnnounce {
7278
context: ConnectionContext::new(
7379
SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 195)), 8080),
74-
SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969),
80+
ServiceBinding::new(
81+
Protocol::UDP,
82+
SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969),
83+
)
84+
.unwrap(),
7585
),
7686
},
7787
&stats_repository,
@@ -91,7 +101,11 @@ mod tests {
91101
Event::UdpScrape {
92102
context: ConnectionContext::new(
93103
SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 195)), 8080),
94-
SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969),
104+
ServiceBinding::new(
105+
Protocol::UDP,
106+
SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969),
107+
)
108+
.unwrap(),
95109
),
96110
},
97111
&stats_repository,
@@ -111,7 +125,11 @@ mod tests {
111125
Event::UdpConnect {
112126
context: ConnectionContext::new(
113127
SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 195)), 8080),
114-
SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969),
128+
ServiceBinding::new(
129+
Protocol::UDP,
130+
SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969),
131+
)
132+
.unwrap(),
115133
),
116134
},
117135
&stats_repository,
@@ -131,7 +149,11 @@ mod tests {
131149
Event::UdpAnnounce {
132150
context: ConnectionContext::new(
133151
SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 195)), 8080),
134-
SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969),
152+
ServiceBinding::new(
153+
Protocol::UDP,
154+
SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969),
155+
)
156+
.unwrap(),
135157
),
136158
},
137159
&stats_repository,
@@ -151,7 +173,11 @@ mod tests {
151173
Event::UdpScrape {
152174
context: ConnectionContext::new(
153175
SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 195)), 8080),
154-
SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969),
176+
ServiceBinding::new(
177+
Protocol::UDP,
178+
SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969),
179+
)
180+
.unwrap(),
155181
),
156182
},
157183
&stats_repository,

packages/udp-tracker-server/src/event/mod.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
use std::net::SocketAddr;
22
use std::time::Duration;
33

4+
use torrust_tracker_primitives::service_binding::ServiceBinding;
5+
46
pub mod sender;
57

68
/// A UDP server event.
@@ -52,15 +54,15 @@ pub enum UdpResponseKind {
5254
#[derive(Debug, PartialEq, Eq, Clone)]
5355
pub struct ConnectionContext {
5456
client_socket_addr: SocketAddr,
55-
server_socket_addr: SocketAddr,
57+
server_service_binding: ServiceBinding,
5658
}
5759

5860
impl ConnectionContext {
5961
#[must_use]
60-
pub fn new(client_socket_addr: SocketAddr, server_socket_addr: SocketAddr) -> Self {
62+
pub fn new(client_socket_addr: SocketAddr, server_service_binding: ServiceBinding) -> Self {
6163
Self {
6264
client_socket_addr,
63-
server_socket_addr,
65+
server_service_binding,
6466
}
6567
}
6668

@@ -71,6 +73,6 @@ impl ConnectionContext {
7173

7274
#[must_use]
7375
pub fn server_socket_addr(&self) -> SocketAddr {
74-
self.server_socket_addr
76+
self.server_service_binding.bind_address()
7577
}
7678
}

0 commit comments

Comments
 (0)