Skip to content

Commit 8ec45ad

Browse files
committed
refactor: [torrust#1326] extract bittorrent_http_tracker_core::services::scrape::ScrapeService
1 parent 9cda8ec commit 8ec45ad

File tree

6 files changed

+191
-215
lines changed

6 files changed

+191
-215
lines changed

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

+9-1
Original file line numberDiff line numberDiff line change
@@ -238,8 +238,8 @@ pub fn check_fn(binding: &SocketAddr) -> ServiceHealthCheckJob {
238238
mod tests {
239239
use std::sync::Arc;
240240

241-
use bittorrent_http_tracker_core::container::HttpTrackerCoreContainer;
242241
use bittorrent_http_tracker_core::services::announce::AnnounceService;
242+
use bittorrent_http_tracker_core::{container::HttpTrackerCoreContainer, services::scrape::ScrapeService};
243243
use bittorrent_tracker_core::announce_handler::AnnounceHandler;
244244
use bittorrent_tracker_core::authentication::key::repository::in_memory::InMemoryKeyRepository;
245245
use bittorrent_tracker_core::authentication::service;
@@ -302,6 +302,13 @@ mod tests {
302302
http_stats_event_sender.clone(),
303303
));
304304

305+
let scrape_service = Arc::new(ScrapeService::new(
306+
core_config.clone(),
307+
scrape_handler.clone(),
308+
authentication_service.clone(),
309+
http_stats_event_sender.clone(),
310+
));
311+
305312
HttpTrackerCoreContainer {
306313
core_config,
307314
announce_handler,
@@ -313,6 +320,7 @@ mod tests {
313320
http_stats_event_sender,
314321
http_stats_repository,
315322
announce_service,
323+
scrape_service,
316324
}
317325
}
318326

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

+68-134
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,12 @@ use std::sync::Arc;
66

77
use axum::extract::State;
88
use axum::response::{IntoResponse, Response};
9-
use bittorrent_http_tracker_core::services::scrape::HttpScrapeError;
9+
use bittorrent_http_tracker_core::services::scrape::ScrapeService;
1010
use bittorrent_http_tracker_protocol::v1::requests::scrape::Scrape;
1111
use bittorrent_http_tracker_protocol::v1::responses;
1212
use bittorrent_http_tracker_protocol::v1::services::peer_ip_resolver::ClientIpSources;
13-
use bittorrent_tracker_core::authentication::service::AuthenticationService;
1413
use bittorrent_tracker_core::authentication::Key;
15-
use bittorrent_tracker_core::scrape_handler::ScrapeHandler;
1614
use hyper::StatusCode;
17-
use torrust_tracker_configuration::Core;
1815
use torrust_tracker_primitives::core::ScrapeData;
1916

2017
use crate::v1::extractors::authentication_key::Extract as ExtractKey;
@@ -24,82 +21,41 @@ use crate::v1::extractors::scrape_request::ExtractRequest;
2421
/// It handles the `scrape` request when the HTTP tracker is configured
2522
/// to run in `public` mode.
2623
#[allow(clippy::unused_async)]
27-
#[allow(clippy::type_complexity)]
2824
pub async fn handle_without_key(
29-
State(state): State<(
30-
Arc<Core>,
31-
Arc<ScrapeHandler>,
32-
Arc<AuthenticationService>,
33-
Arc<Option<Box<dyn bittorrent_http_tracker_core::statistics::event::sender::Sender>>>,
34-
)>,
25+
State(state): State<Arc<ScrapeService>>,
3526
ExtractRequest(scrape_request): ExtractRequest,
3627
ExtractClientIpSources(client_ip_sources): ExtractClientIpSources,
3728
) -> Response {
3829
tracing::debug!("http scrape request: {:#?}", &scrape_request);
3930

40-
handle(
41-
&state.0,
42-
&state.1,
43-
&state.2,
44-
&state.3,
45-
&scrape_request,
46-
&client_ip_sources,
47-
None,
48-
)
49-
.await
31+
handle(&state, &scrape_request, &client_ip_sources, None).await
5032
}
5133

5234
/// It handles the `scrape` request when the HTTP tracker is configured
5335
/// to run in `private` or `private_listed` mode.
5436
///
5537
/// In this case, the authentication `key` parameter is required.
5638
#[allow(clippy::unused_async)]
57-
#[allow(clippy::type_complexity)]
5839
pub async fn handle_with_key(
59-
State(state): State<(
60-
Arc<Core>,
61-
Arc<ScrapeHandler>,
62-
Arc<AuthenticationService>,
63-
Arc<Option<Box<dyn bittorrent_http_tracker_core::statistics::event::sender::Sender>>>,
64-
)>,
40+
State(state): State<Arc<ScrapeService>>,
6541
ExtractRequest(scrape_request): ExtractRequest,
6642
ExtractClientIpSources(client_ip_sources): ExtractClientIpSources,
6743
ExtractKey(key): ExtractKey,
6844
) -> Response {
6945
tracing::debug!("http scrape request: {:#?}", &scrape_request);
7046

71-
handle(
72-
&state.0,
73-
&state.1,
74-
&state.2,
75-
&state.3,
76-
&scrape_request,
77-
&client_ip_sources,
78-
Some(key),
79-
)
80-
.await
47+
handle(&state, &scrape_request, &client_ip_sources, Some(key)).await
8148
}
8249

83-
#[allow(clippy::too_many_arguments)]
8450
async fn handle(
85-
core_config: &Arc<Core>,
86-
scrape_handler: &Arc<ScrapeHandler>,
87-
authentication_service: &Arc<AuthenticationService>,
88-
http_stats_event_sender: &Arc<Option<Box<dyn bittorrent_http_tracker_core::statistics::event::sender::Sender>>>,
51+
scrape_service: &Arc<ScrapeService>,
8952
scrape_request: &Scrape,
9053
client_ip_sources: &ClientIpSources,
9154
maybe_key: Option<Key>,
9255
) -> Response {
93-
let scrape_data = match handle_scrape(
94-
core_config,
95-
scrape_handler,
96-
authentication_service,
97-
http_stats_event_sender,
98-
scrape_request,
99-
client_ip_sources,
100-
maybe_key,
101-
)
102-
.await
56+
let scrape_data = match scrape_service
57+
.handle_scrape(scrape_request, client_ip_sources, maybe_key)
58+
.await
10359
{
10460
Ok(scrape_data) => scrape_data,
10561
Err(error) => {
@@ -113,28 +69,6 @@ async fn handle(
11369
build_response(scrape_data)
11470
}
11571

116-
#[allow(clippy::too_many_arguments)]
117-
async fn handle_scrape(
118-
core_config: &Arc<Core>,
119-
scrape_handler: &Arc<ScrapeHandler>,
120-
authentication_service: &Arc<AuthenticationService>,
121-
opt_http_stats_event_sender: &Arc<Option<Box<dyn bittorrent_http_tracker_core::statistics::event::sender::Sender>>>,
122-
scrape_request: &Scrape,
123-
client_ip_sources: &ClientIpSources,
124-
maybe_key: Option<Key>,
125-
) -> Result<ScrapeData, HttpScrapeError> {
126-
bittorrent_http_tracker_core::services::scrape::handle_scrape(
127-
core_config,
128-
scrape_handler,
129-
authentication_service,
130-
opt_http_stats_event_sender,
131-
scrape_request,
132-
client_ip_sources,
133-
maybe_key,
134-
)
135-
.await
136-
}
137-
13872
fn build_response(scrape_data: ScrapeData) -> Response {
13973
let response = responses::scrape::Bencoded::from(scrape_data);
14074

@@ -233,11 +167,11 @@ mod tests {
233167
mod with_tracker_in_private_mode {
234168
use std::str::FromStr;
235169

170+
use bittorrent_http_tracker_core::services::scrape::ScrapeService;
236171
use bittorrent_tracker_core::authentication;
237172
use torrust_tracker_primitives::core::ScrapeData;
238173

239174
use super::{initialize_private_tracker, sample_client_ip_sources, sample_scrape_request};
240-
use crate::v1::handlers::scrape::handle_scrape;
241175

242176
#[tokio::test]
243177
async fn it_should_return_zeroed_swarm_metadata_when_the_authentication_key_is_missing() {
@@ -246,17 +180,17 @@ mod tests {
246180
let scrape_request = sample_scrape_request();
247181
let maybe_key = None;
248182

249-
let scrape_data = handle_scrape(
250-
&core_tracker_services.core_config,
251-
&core_tracker_services.scrape_handler,
252-
&core_tracker_services.authentication_service,
253-
&core_http_tracker_services.http_stats_event_sender,
254-
&scrape_request,
255-
&sample_client_ip_sources(),
256-
maybe_key,
257-
)
258-
.await
259-
.unwrap();
183+
let scrape_service = ScrapeService::new(
184+
core_tracker_services.core_config.clone(),
185+
core_tracker_services.scrape_handler.clone(),
186+
core_tracker_services.authentication_service.clone(),
187+
core_http_tracker_services.http_stats_event_sender.clone(),
188+
);
189+
190+
let scrape_data = scrape_service
191+
.handle_scrape(&scrape_request, &sample_client_ip_sources(), maybe_key)
192+
.await
193+
.unwrap();
260194

261195
let expected_scrape_data = ScrapeData::zeroed(&scrape_request.info_hashes);
262196

@@ -271,17 +205,17 @@ mod tests {
271205
let unregistered_key = authentication::Key::from_str("YZSl4lMZupRuOpSRC3krIKR5BPB14nrJ").unwrap();
272206
let maybe_key = Some(unregistered_key);
273207

274-
let scrape_data = handle_scrape(
275-
&core_tracker_services.core_config,
276-
&core_tracker_services.scrape_handler,
277-
&core_tracker_services.authentication_service,
278-
&core_http_tracker_services.http_stats_event_sender,
279-
&scrape_request,
280-
&sample_client_ip_sources(),
281-
maybe_key,
282-
)
283-
.await
284-
.unwrap();
208+
let scrape_service = ScrapeService::new(
209+
core_tracker_services.core_config.clone(),
210+
core_tracker_services.scrape_handler.clone(),
211+
core_tracker_services.authentication_service.clone(),
212+
core_http_tracker_services.http_stats_event_sender.clone(),
213+
);
214+
215+
let scrape_data = scrape_service
216+
.handle_scrape(&scrape_request, &sample_client_ip_sources(), maybe_key)
217+
.await
218+
.unwrap();
285219

286220
let expected_scrape_data = ScrapeData::zeroed(&scrape_request.info_hashes);
287221

@@ -291,28 +225,28 @@ mod tests {
291225

292226
mod with_tracker_in_listed_mode {
293227

228+
use bittorrent_http_tracker_core::services::scrape::ScrapeService;
294229
use torrust_tracker_primitives::core::ScrapeData;
295230

296231
use super::{initialize_listed_tracker, sample_client_ip_sources, sample_scrape_request};
297-
use crate::v1::handlers::scrape::handle_scrape;
298232

299233
#[tokio::test]
300234
async fn it_should_return_zeroed_swarm_metadata_when_the_torrent_is_not_whitelisted() {
301235
let (core_tracker_services, core_http_tracker_services) = initialize_listed_tracker();
302236

303237
let scrape_request = sample_scrape_request();
304238

305-
let scrape_data = handle_scrape(
306-
&core_tracker_services.core_config,
307-
&core_tracker_services.scrape_handler,
308-
&core_tracker_services.authentication_service,
309-
&core_http_tracker_services.http_stats_event_sender,
310-
&scrape_request,
311-
&sample_client_ip_sources(),
312-
None,
313-
)
314-
.await
315-
.unwrap();
239+
let scrape_service = ScrapeService::new(
240+
core_tracker_services.core_config.clone(),
241+
core_tracker_services.scrape_handler.clone(),
242+
core_tracker_services.authentication_service.clone(),
243+
core_http_tracker_services.http_stats_event_sender.clone(),
244+
);
245+
246+
let scrape_data = scrape_service
247+
.handle_scrape(&scrape_request, &sample_client_ip_sources(), None)
248+
.await
249+
.unwrap();
316250

317251
let expected_scrape_data = ScrapeData::zeroed(&scrape_request.info_hashes);
318252

@@ -322,11 +256,11 @@ mod tests {
322256

323257
mod with_tracker_on_reverse_proxy {
324258

259+
use bittorrent_http_tracker_core::services::scrape::ScrapeService;
325260
use bittorrent_http_tracker_protocol::v1::responses;
326261
use bittorrent_http_tracker_protocol::v1::services::peer_ip_resolver::ClientIpSources;
327262

328263
use super::{initialize_tracker_on_reverse_proxy, sample_scrape_request};
329-
use crate::v1::handlers::scrape::handle_scrape;
330264
use crate::v1::handlers::scrape::tests::assert_error_response;
331265

332266
#[tokio::test]
@@ -338,17 +272,17 @@ mod tests {
338272
connection_info_ip: None,
339273
};
340274

341-
let response = handle_scrape(
342-
&core_tracker_services.core_config,
343-
&core_tracker_services.scrape_handler,
344-
&core_tracker_services.authentication_service,
345-
&core_http_tracker_services.http_stats_event_sender,
346-
&sample_scrape_request(),
347-
&client_ip_sources,
348-
None,
349-
)
350-
.await
351-
.unwrap_err();
275+
let scrape_service = ScrapeService::new(
276+
core_tracker_services.core_config.clone(),
277+
core_tracker_services.scrape_handler.clone(),
278+
core_tracker_services.authentication_service.clone(),
279+
core_http_tracker_services.http_stats_event_sender.clone(),
280+
);
281+
282+
let response = scrape_service
283+
.handle_scrape(&sample_scrape_request(), &client_ip_sources, None)
284+
.await
285+
.unwrap_err();
352286

353287
let error_response = responses::error::Error {
354288
failure_reason: response.to_string(),
@@ -363,11 +297,11 @@ mod tests {
363297

364298
mod with_tracker_not_on_reverse_proxy {
365299

300+
use bittorrent_http_tracker_core::services::scrape::ScrapeService;
366301
use bittorrent_http_tracker_protocol::v1::responses;
367302
use bittorrent_http_tracker_protocol::v1::services::peer_ip_resolver::ClientIpSources;
368303

369304
use super::{initialize_tracker_not_on_reverse_proxy, sample_scrape_request};
370-
use crate::v1::handlers::scrape::handle_scrape;
371305
use crate::v1::handlers::scrape::tests::assert_error_response;
372306

373307
#[tokio::test]
@@ -379,17 +313,17 @@ mod tests {
379313
connection_info_ip: None,
380314
};
381315

382-
let response = handle_scrape(
383-
&core_tracker_services.core_config,
384-
&core_tracker_services.scrape_handler,
385-
&core_tracker_services.authentication_service,
386-
&core_http_tracker_services.http_stats_event_sender,
387-
&sample_scrape_request(),
388-
&client_ip_sources,
389-
None,
390-
)
391-
.await
392-
.unwrap_err();
316+
let scrape_service = ScrapeService::new(
317+
core_tracker_services.core_config.clone(),
318+
core_tracker_services.scrape_handler.clone(),
319+
core_tracker_services.authentication_service.clone(),
320+
core_http_tracker_services.http_stats_event_sender.clone(),
321+
);
322+
323+
let response = scrape_service
324+
.handle_scrape(&sample_scrape_request(), &client_ip_sources, None)
325+
.await
326+
.unwrap_err();
393327

394328
let error_response = responses::error::Error {
395329
failure_reason: response.to_string(),

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

+2-12
Original file line numberDiff line numberDiff line change
@@ -47,21 +47,11 @@ pub fn router(http_tracker_container: Arc<HttpTrackerCoreContainer>, server_sock
4747
// Scrape request
4848
.route(
4949
"/scrape",
50-
get(scrape::handle_without_key).with_state((
51-
http_tracker_container.core_config.clone(),
52-
http_tracker_container.scrape_handler.clone(),
53-
http_tracker_container.authentication_service.clone(),
54-
http_tracker_container.http_stats_event_sender.clone(),
55-
)),
50+
get(scrape::handle_without_key).with_state(http_tracker_container.scrape_service.clone()),
5651
)
5752
.route(
5853
"/scrape/{key}",
59-
get(scrape::handle_with_key).with_state((
60-
http_tracker_container.core_config.clone(),
61-
http_tracker_container.scrape_handler.clone(),
62-
http_tracker_container.authentication_service.clone(),
63-
http_tracker_container.http_stats_event_sender.clone(),
64-
)),
54+
get(scrape::handle_with_key).with_state(http_tracker_container.scrape_service.clone()),
6555
)
6656
// Add extension to get the client IP from the connection info
6757
.layer(SecureClientIpSource::ConnectInfo.into_extension())

0 commit comments

Comments
 (0)