Skip to content

Commit 6de2dd9

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

File tree

9 files changed

+301
-80
lines changed

9 files changed

+301
-80
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/handlers/scrape.rs

+29-10
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,13 +23,13 @@ use crate::v1::extractors::scrape_request::ExtractRequest;
2223
/// to run in `public` mode.
2324
#[allow(clippy::unused_async)]
2425
pub async fn handle_without_key(
25-
State(state): State<Arc<ScrapeService>>,
26+
State(state): State<(Arc<ScrapeService>, SocketAddr)>,
2627
ExtractRequest(scrape_request): ExtractRequest,
2728
ExtractClientIpSources(client_ip_sources): ExtractClientIpSources,
2829
) -> Response {
2930
tracing::debug!("http scrape request: {:#?}", &scrape_request);
3031

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

3435
/// It handles the `scrape` request when the HTTP tracker is configured
@@ -37,24 +38,25 @@ pub async fn handle_without_key(
3738
/// In this case, the authentication `key` parameter is required.
3839
#[allow(clippy::unused_async)]
3940
pub async fn handle_with_key(
40-
State(state): State<Arc<ScrapeService>>,
41+
State(state): State<(Arc<ScrapeService>, SocketAddr)>,
4142
ExtractRequest(scrape_request): ExtractRequest,
4243
ExtractClientIpSources(client_ip_sources): ExtractClientIpSources,
4344
ExtractKey(key): ExtractKey,
4445
) -> Response {
4546
tracing::debug!("http scrape request: {:#?}", &scrape_request);
4647

47-
handle(&state, &scrape_request, &client_ip_sources, Some(key)).await
48+
handle(&state.0, &scrape_request, &client_ip_sources, &state.1, Some(key)).await
4849
}
4950

5051
async fn handle(
5152
scrape_service: &Arc<ScrapeService>,
5253
scrape_request: &Scrape,
5354
client_ip_sources: &ClientIpSources,
55+
server_socket_addr: &SocketAddr,
5456
maybe_key: Option<Key>,
5557
) -> Response {
5658
let scrape_data = match scrape_service
57-
.handle_scrape(scrape_request, client_ip_sources, maybe_key)
59+
.handle_scrape(scrape_request, client_ip_sources, server_socket_addr, maybe_key)
5860
.await
5961
{
6062
Ok(scrape_data) => scrape_data,
@@ -165,6 +167,7 @@ mod tests {
165167
}
166168

167169
mod with_tracker_in_private_mode {
170+
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
168171
use std::str::FromStr;
169172

170173
use bittorrent_http_tracker_core::services::scrape::ScrapeService;
@@ -175,6 +178,8 @@ mod tests {
175178

176179
#[tokio::test]
177180
async fn it_should_return_zeroed_swarm_metadata_when_the_authentication_key_is_missing() {
181+
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
182+
178183
let (core_tracker_services, core_http_tracker_services) = initialize_private_tracker();
179184

180185
let scrape_request = sample_scrape_request();
@@ -188,7 +193,7 @@ mod tests {
188193
);
189194

190195
let scrape_data = scrape_service
191-
.handle_scrape(&scrape_request, &sample_client_ip_sources(), maybe_key)
196+
.handle_scrape(&scrape_request, &sample_client_ip_sources(), &server_socket_addr, maybe_key)
192197
.await
193198
.unwrap();
194199

@@ -199,6 +204,8 @@ mod tests {
199204

200205
#[tokio::test]
201206
async fn it_should_return_zeroed_swarm_metadata_when_the_authentication_key_is_invalid() {
207+
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
208+
202209
let (core_tracker_services, core_http_tracker_services) = initialize_private_tracker();
203210

204211
let scrape_request = sample_scrape_request();
@@ -213,7 +220,7 @@ mod tests {
213220
);
214221

215222
let scrape_data = scrape_service
216-
.handle_scrape(&scrape_request, &sample_client_ip_sources(), maybe_key)
223+
.handle_scrape(&scrape_request, &sample_client_ip_sources(), &server_socket_addr, maybe_key)
217224
.await
218225
.unwrap();
219226

@@ -225,6 +232,8 @@ mod tests {
225232

226233
mod with_tracker_in_listed_mode {
227234

235+
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
236+
228237
use bittorrent_http_tracker_core::services::scrape::ScrapeService;
229238
use torrust_tracker_primitives::core::ScrapeData;
230239

@@ -236,6 +245,8 @@ mod tests {
236245

237246
let scrape_request = sample_scrape_request();
238247

248+
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
249+
239250
let scrape_service = ScrapeService::new(
240251
core_tracker_services.core_config.clone(),
241252
core_tracker_services.scrape_handler.clone(),
@@ -244,7 +255,7 @@ mod tests {
244255
);
245256

246257
let scrape_data = scrape_service
247-
.handle_scrape(&scrape_request, &sample_client_ip_sources(), None)
258+
.handle_scrape(&scrape_request, &sample_client_ip_sources(), &server_socket_addr, None)
248259
.await
249260
.unwrap();
250261

@@ -256,6 +267,8 @@ mod tests {
256267

257268
mod with_tracker_on_reverse_proxy {
258269

270+
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
271+
259272
use bittorrent_http_tracker_core::services::scrape::ScrapeService;
260273
use bittorrent_http_tracker_protocol::v1::responses;
261274
use bittorrent_http_tracker_protocol::v1::services::peer_ip_resolver::ClientIpSources;
@@ -272,6 +285,8 @@ mod tests {
272285
connection_info_ip: None,
273286
};
274287

288+
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
289+
275290
let scrape_service = ScrapeService::new(
276291
core_tracker_services.core_config.clone(),
277292
core_tracker_services.scrape_handler.clone(),
@@ -280,7 +295,7 @@ mod tests {
280295
);
281296

282297
let response = scrape_service
283-
.handle_scrape(&sample_scrape_request(), &client_ip_sources, None)
298+
.handle_scrape(&sample_scrape_request(), &client_ip_sources, &server_socket_addr, None)
284299
.await
285300
.unwrap_err();
286301

@@ -297,6 +312,8 @@ mod tests {
297312

298313
mod with_tracker_not_on_reverse_proxy {
299314

315+
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
316+
300317
use bittorrent_http_tracker_core::services::scrape::ScrapeService;
301318
use bittorrent_http_tracker_protocol::v1::responses;
302319
use bittorrent_http_tracker_protocol::v1::services::peer_ip_resolver::ClientIpSources;
@@ -313,6 +330,8 @@ mod tests {
313330
connection_info_ip: None,
314331
};
315332

333+
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
334+
316335
let scrape_service = ScrapeService::new(
317336
core_tracker_services.core_config.clone(),
318337
core_tracker_services.scrape_handler.clone(),
@@ -321,7 +340,7 @@ mod tests {
321340
);
322341

323342
let response = scrape_service
324-
.handle_scrape(&sample_scrape_request(), &client_ip_sources, None)
343+
.handle_scrape(&sample_scrape_request(), &client_ip_sources, &server_socket_addr, None)
325344
.await
326345
.unwrap_err();
327346

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -38,20 +38,20 @@ 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(
4949
"/scrape",
50-
get(scrape::handle_without_key).with_state(http_tracker_container.scrape_service.clone()),
50+
get(scrape::handle_without_key).with_state((http_tracker_container.scrape_service.clone(), server_socket_addr)),
5151
)
5252
.route(
5353
"/scrape/{key}",
54-
get(scrape::handle_with_key).with_state(http_tracker_container.scrape_service.clone()),
54+
get(scrape::handle_with_key).with_state((http_tracker_container.scrape_service.clone(), server_socket_addr)),
5555
)
5656
// Add extension to get the client IP from the connection info
5757
.layer(SecureClientIpSource::ConnectInfo.into_extension())

0 commit comments

Comments
 (0)