Skip to content

Commit 97a67d1

Browse files
committed
refactor: [torrust#1371] add connection context to HTTP core events
1 parent 3d3d0c7 commit 97a67d1

File tree

7 files changed

+118
-29
lines changed

7 files changed

+118
-29
lines changed

packages/axum-http-tracker-server/src/v1/handlers/announce.rs

+39-6
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
//!
33
//! The handlers perform the authentication and authorization of the request,
44
//! and resolve the client IP address.
5+
use std::net::SocketAddr;
56
use std::sync::Arc;
67

78
use axum::extract::State;
@@ -22,27 +23,27 @@ use crate::v1::extractors::client_ip_sources::Extract as ExtractClientIpSources;
2223
/// authentication (no PATH `key` parameter required).
2324
#[allow(clippy::unused_async)]
2425
pub async fn handle_without_key(
25-
State(state): State<Arc<AnnounceService>>,
26+
State(state): State<(Arc<AnnounceService>, SocketAddr)>,
2627
ExtractRequest(announce_request): ExtractRequest,
2728
ExtractClientIpSources(client_ip_sources): ExtractClientIpSources,
2829
) -> Response {
2930
tracing::debug!("http announce request: {:#?}", announce_request);
3031

31-
handle(&state, &announce_request, &client_ip_sources, None).await
32+
handle(&state.0, &announce_request, &client_ip_sources, &state.1, None).await
3233
}
3334

3435
/// It handles the `announce` request when the HTTP tracker requires
3536
/// authentication (PATH `key` parameter required).
3637
#[allow(clippy::unused_async)]
3738
pub async fn handle_with_key(
38-
State(state): State<Arc<AnnounceService>>,
39+
State(state): State<(Arc<AnnounceService>, SocketAddr)>,
3940
ExtractRequest(announce_request): ExtractRequest,
4041
ExtractClientIpSources(client_ip_sources): ExtractClientIpSources,
4142
ExtractKey(key): ExtractKey,
4243
) -> Response {
4344
tracing::debug!("http announce request: {:#?}", announce_request);
4445

45-
handle(&state, &announce_request, &client_ip_sources, Some(key)).await
46+
handle(&state.0, &announce_request, &client_ip_sources, &state.1, Some(key)).await
4647
}
4748

4849
/// It handles the `announce` request.
@@ -53,9 +54,18 @@ async fn handle(
5354
announce_service: &Arc<AnnounceService>,
5455
announce_request: &Announce,
5556
client_ip_sources: &ClientIpSources,
57+
server_socket_addr: &SocketAddr,
5658
maybe_key: Option<Key>,
5759
) -> Response {
58-
let announce_data = match handle_announce(announce_service, announce_request, client_ip_sources, maybe_key).await {
60+
let announce_data = match handle_announce(
61+
announce_service,
62+
announce_request,
63+
client_ip_sources,
64+
server_socket_addr,
65+
maybe_key,
66+
)
67+
.await
68+
{
5969
Ok(announce_data) => announce_data,
6070
Err(error) => {
6171
let error_response = responses::error::Error {
@@ -71,10 +81,11 @@ async fn handle_announce(
7181
announce_service: &Arc<AnnounceService>,
7282
announce_request: &Announce,
7383
client_ip_sources: &ClientIpSources,
84+
server_socket_addr: &SocketAddr,
7485
maybe_key: Option<Key>,
7586
) -> Result<AnnounceData, HttpAnnounceError> {
7687
announce_service
77-
.handle_announce(announce_request, client_ip_sources, maybe_key)
88+
.handle_announce(announce_request, client_ip_sources, server_socket_addr, maybe_key)
7889
.await
7990
}
8091

@@ -196,6 +207,7 @@ mod tests {
196207

197208
mod with_tracker_in_private_mode {
198209

210+
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
199211
use std::str::FromStr;
200212

201213
use bittorrent_http_tracker_protocol::v1::responses;
@@ -209,12 +221,15 @@ mod tests {
209221
async fn it_should_fail_when_the_authentication_key_is_missing() {
210222
let http_core_tracker_services = initialize_private_tracker();
211223

224+
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
225+
212226
let maybe_key = None;
213227

214228
let response = handle_announce(
215229
&http_core_tracker_services.announce_service,
216230
&sample_announce_request(),
217231
&sample_client_ip_sources(),
232+
&server_socket_addr,
218233
maybe_key,
219234
)
220235
.await
@@ -236,12 +251,15 @@ mod tests {
236251

237252
let unregistered_key = authentication::Key::from_str("YZSl4lMZupRuOpSRC3krIKR5BPB14nrJ").unwrap();
238253

254+
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
255+
239256
let maybe_key = Some(unregistered_key);
240257

241258
let response = handle_announce(
242259
&http_core_tracker_services.announce_service,
243260
&sample_announce_request(),
244261
&sample_client_ip_sources(),
262+
&server_socket_addr,
245263
maybe_key,
246264
)
247265
.await
@@ -260,6 +278,8 @@ mod tests {
260278

261279
mod with_tracker_in_listed_mode {
262280

281+
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
282+
263283
use bittorrent_http_tracker_protocol::v1::responses;
264284

265285
use super::{initialize_listed_tracker, sample_announce_request, sample_client_ip_sources};
@@ -272,10 +292,13 @@ mod tests {
272292

273293
let announce_request = sample_announce_request();
274294

295+
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
296+
275297
let response = handle_announce(
276298
&http_core_tracker_services.announce_service,
277299
&announce_request,
278300
&sample_client_ip_sources(),
301+
&server_socket_addr,
279302
None,
280303
)
281304
.await
@@ -297,6 +320,8 @@ mod tests {
297320

298321
mod with_tracker_on_reverse_proxy {
299322

323+
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
324+
300325
use bittorrent_http_tracker_protocol::v1::responses;
301326
use bittorrent_http_tracker_protocol::v1::services::peer_ip_resolver::ClientIpSources;
302327

@@ -313,10 +338,13 @@ mod tests {
313338
connection_info_ip: None,
314339
};
315340

341+
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
342+
316343
let response = handle_announce(
317344
&http_core_tracker_services.announce_service,
318345
&sample_announce_request(),
319346
&client_ip_sources,
347+
&server_socket_addr,
320348
None,
321349
)
322350
.await
@@ -335,6 +363,8 @@ mod tests {
335363

336364
mod with_tracker_not_on_reverse_proxy {
337365

366+
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
367+
338368
use bittorrent_http_tracker_protocol::v1::responses;
339369
use bittorrent_http_tracker_protocol::v1::services::peer_ip_resolver::ClientIpSources;
340370

@@ -351,10 +381,13 @@ mod tests {
351381
connection_info_ip: None,
352382
};
353383

384+
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
385+
354386
let response = handle_announce(
355387
&http_core_tracker_services.announce_service,
356388
&sample_announce_request(),
357389
&client_ip_sources,
390+
&server_socket_addr,
358391
None,
359392
)
360393
.await

packages/axum-http-tracker-server/src/v1/routes.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@ pub fn router(http_tracker_container: Arc<HttpTrackerCoreContainer>, server_sock
3838
// Announce request
3939
.route(
4040
"/announce",
41-
get(announce::handle_without_key).with_state(http_tracker_container.announce_service.clone()),
41+
get(announce::handle_without_key).with_state((http_tracker_container.announce_service.clone(), server_socket_addr)),
4242
)
4343
.route(
4444
"/announce/{key}",
45-
get(announce::handle_with_key).with_state(http_tracker_container.announce_service.clone()),
45+
get(announce::handle_with_key).with_state((http_tracker_container.announce_service.clone(), server_socket_addr)),
4646
)
4747
// Scrape request
4848
.route(

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

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
12
use std::time::{Duration, Instant};
23

34
use bittorrent_http_tracker_core::services::announce::AnnounceService;
@@ -20,12 +21,16 @@ pub async fn return_announce_data_once(samples: u64) -> Duration {
2021
core_http_tracker_services.http_stats_event_sender.clone(),
2122
);
2223

24+
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
25+
2326
let start = Instant::now();
27+
2428
for _ in 0..samples {
2529
let _announce_data = announce_service
26-
.handle_announce(&announce_request, &client_ip_sources, None)
30+
.handle_announce(&announce_request, &client_ip_sources, &server_socket_addr, None)
2731
.await
2832
.unwrap();
2933
}
34+
3035
start.elapsed()
3136
}

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

+37-10
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
//!
88
//! It also sends an [`http_tracker_core::statistics::event::Event`]
99
//! because events are specific for the HTTP tracker.
10-
use std::net::IpAddr;
10+
use std::net::{IpAddr, SocketAddr};
1111
use std::panic::Location;
1212
use std::sync::Arc;
1313

@@ -68,6 +68,7 @@ impl AnnounceService {
6868
&self,
6969
announce_request: &Announce,
7070
client_ip_sources: &ClientIpSources,
71+
server_socket_addr: &SocketAddr,
7172
maybe_key: Option<Key>,
7273
) -> Result<AnnounceData, HttpAnnounceError> {
7374
self.authenticate(maybe_key).await?;
@@ -85,7 +86,7 @@ impl AnnounceService {
8586
.announce(&announce_request.info_hash, &mut peer, &remote_client_ip, &peers_wanted)
8687
.await?;
8788

88-
self.send_stats_event(remote_client_ip).await;
89+
self.send_stats_event(remote_client_ip, *server_socket_addr).await;
8990

9091
Ok(announce_data)
9192
}
@@ -122,12 +123,17 @@ impl AnnounceService {
122123
}
123124
}
124125

125-
async fn send_stats_event(&self, peer_ip: IpAddr) {
126+
async fn send_stats_event(&self, peer_ip: IpAddr, server_socket_addr: SocketAddr) {
126127
if let Some(http_stats_event_sender) = self.opt_http_stats_event_sender.as_deref() {
127128
match peer_ip {
128129
IpAddr::V4(_) => {
129130
http_stats_event_sender
130-
.send_event(statistics::event::Event::Tcp4Announce)
131+
.send_event(statistics::event::Event::Tcp4Announce {
132+
connection: statistics::event::ConnectionContext {
133+
client_ip: peer_ip,
134+
server_socket_addr,
135+
},
136+
})
131137
.await;
132138
}
133139
IpAddr::V6(_) => {
@@ -338,6 +344,7 @@ mod tests {
338344
};
339345
use crate::services::announce::AnnounceService;
340346
use crate::statistics;
347+
use crate::statistics::event::ConnectionContext;
341348

342349
#[tokio::test]
343350
async fn it_should_return_the_announce_data() {
@@ -347,6 +354,8 @@ mod tests {
347354

348355
let (announce_request, client_ip_sources) = sample_announce_request_for_peer(peer);
349356

357+
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
358+
350359
let announce_service = AnnounceService::new(
351360
core_tracker_services.core_config.clone(),
352361
core_tracker_services.announce_handler.clone(),
@@ -356,7 +365,7 @@ mod tests {
356365
);
357366

358367
let announce_data = announce_service
359-
.handle_announce(&announce_request, &client_ip_sources, None)
368+
.handle_announce(&announce_request, &client_ip_sources, &server_socket_addr, None)
360369
.await
361370
.unwrap();
362371

@@ -375,16 +384,24 @@ mod tests {
375384

376385
#[tokio::test]
377386
async fn it_should_send_the_tcp_4_announce_event_when_the_peer_uses_ipv4() {
387+
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
388+
378389
let mut http_stats_event_sender_mock = MockHttpStatsEventSender::new();
379390
http_stats_event_sender_mock
380391
.expect_send_event()
381-
.with(eq(statistics::event::Event::Tcp4Announce))
392+
.with(eq(statistics::event::Event::Tcp4Announce {
393+
connection: ConnectionContext {
394+
client_ip: IpAddr::V4(Ipv4Addr::new(126, 0, 0, 1)),
395+
server_socket_addr,
396+
},
397+
}))
382398
.times(1)
383399
.returning(|_| Box::pin(future::ready(Some(Ok(())))));
384400
let http_stats_event_sender: Arc<Option<Box<dyn statistics::event::sender::Sender>>> =
385401
Arc::new(Some(Box::new(http_stats_event_sender_mock)));
386402

387403
let (core_tracker_services, mut core_http_tracker_services) = initialize_core_tracker_services();
404+
388405
core_http_tracker_services.http_stats_event_sender = http_stats_event_sender;
389406

390407
let peer = sample_peer_using_ipv4();
@@ -400,7 +417,7 @@ mod tests {
400417
);
401418

402419
let _announce_data = announce_service
403-
.handle_announce(&announce_request, &client_ip_sources, None)
420+
.handle_announce(&announce_request, &client_ip_sources, &server_socket_addr, None)
404421
.await
405422
.unwrap();
406423
}
@@ -425,18 +442,26 @@ mod tests {
425442
{
426443
// Tracker changes the peer IP to the tracker external IP when the peer is using the loopback IP.
427444

445+
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
446+
428447
// Assert that the event sent is a TCP4 event
429448
let mut http_stats_event_sender_mock = MockHttpStatsEventSender::new();
430449
http_stats_event_sender_mock
431450
.expect_send_event()
432-
.with(eq(statistics::event::Event::Tcp4Announce))
451+
.with(eq(statistics::event::Event::Tcp4Announce {
452+
connection: ConnectionContext {
453+
client_ip: IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)),
454+
server_socket_addr,
455+
},
456+
}))
433457
.times(1)
434458
.returning(|_| Box::pin(future::ready(Some(Ok(())))));
435459
let http_stats_event_sender: Arc<Option<Box<dyn statistics::event::sender::Sender>>> =
436460
Arc::new(Some(Box::new(http_stats_event_sender_mock)));
437461

438462
let (core_tracker_services, mut core_http_tracker_services) =
439463
initialize_core_tracker_services_with_config(&tracker_with_an_ipv6_external_ip());
464+
440465
core_http_tracker_services.http_stats_event_sender = http_stats_event_sender;
441466

442467
let peer = peer_with_the_ipv4_loopback_ip();
@@ -452,7 +477,7 @@ mod tests {
452477
);
453478

454479
let _announce_data = announce_service
455-
.handle_announce(&announce_request, &client_ip_sources, None)
480+
.handle_announce(&announce_request, &client_ip_sources, &server_socket_addr, None)
456481
.await
457482
.unwrap();
458483
}
@@ -484,8 +509,10 @@ mod tests {
484509
core_http_tracker_services.http_stats_event_sender.clone(),
485510
);
486511

512+
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
513+
487514
let _announce_data = announce_service
488-
.handle_announce(&announce_request, &client_ip_sources, None)
515+
.handle_announce(&announce_request, &client_ip_sources, &server_socket_addr, None)
489516
.await
490517
.unwrap();
491518
}

0 commit comments

Comments
 (0)