@@ -6,15 +6,12 @@ use std::sync::Arc;
6
6
7
7
use axum:: extract:: State ;
8
8
use axum:: response:: { IntoResponse , Response } ;
9
- use bittorrent_http_tracker_core:: services:: scrape:: HttpScrapeError ;
9
+ use bittorrent_http_tracker_core:: services:: scrape:: ScrapeService ;
10
10
use bittorrent_http_tracker_protocol:: v1:: requests:: scrape:: Scrape ;
11
11
use bittorrent_http_tracker_protocol:: v1:: responses;
12
12
use bittorrent_http_tracker_protocol:: v1:: services:: peer_ip_resolver:: ClientIpSources ;
13
- use bittorrent_tracker_core:: authentication:: service:: AuthenticationService ;
14
13
use bittorrent_tracker_core:: authentication:: Key ;
15
- use bittorrent_tracker_core:: scrape_handler:: ScrapeHandler ;
16
14
use hyper:: StatusCode ;
17
- use torrust_tracker_configuration:: Core ;
18
15
use torrust_tracker_primitives:: core:: ScrapeData ;
19
16
20
17
use crate :: v1:: extractors:: authentication_key:: Extract as ExtractKey ;
@@ -24,82 +21,41 @@ use crate::v1::extractors::scrape_request::ExtractRequest;
24
21
/// It handles the `scrape` request when the HTTP tracker is configured
25
22
/// to run in `public` mode.
26
23
#[ allow( clippy:: unused_async) ]
27
- #[ allow( clippy:: type_complexity) ]
28
24
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 > > ,
35
26
ExtractRequest ( scrape_request) : ExtractRequest ,
36
27
ExtractClientIpSources ( client_ip_sources) : ExtractClientIpSources ,
37
28
) -> Response {
38
29
tracing:: debug!( "http scrape request: {:#?}" , & scrape_request) ;
39
30
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
50
32
}
51
33
52
34
/// It handles the `scrape` request when the HTTP tracker is configured
53
35
/// to run in `private` or `private_listed` mode.
54
36
///
55
37
/// In this case, the authentication `key` parameter is required.
56
38
#[ allow( clippy:: unused_async) ]
57
- #[ allow( clippy:: type_complexity) ]
58
39
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 > > ,
65
41
ExtractRequest ( scrape_request) : ExtractRequest ,
66
42
ExtractClientIpSources ( client_ip_sources) : ExtractClientIpSources ,
67
43
ExtractKey ( key) : ExtractKey ,
68
44
) -> Response {
69
45
tracing:: debug!( "http scrape request: {:#?}" , & scrape_request) ;
70
46
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
81
48
}
82
49
83
- #[ allow( clippy:: too_many_arguments) ]
84
50
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 > ,
89
52
scrape_request : & Scrape ,
90
53
client_ip_sources : & ClientIpSources ,
91
54
maybe_key : Option < Key > ,
92
55
) -> 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
103
59
{
104
60
Ok ( scrape_data) => scrape_data,
105
61
Err ( error) => {
@@ -113,28 +69,6 @@ async fn handle(
113
69
build_response ( scrape_data)
114
70
}
115
71
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
-
138
72
fn build_response ( scrape_data : ScrapeData ) -> Response {
139
73
let response = responses:: scrape:: Bencoded :: from ( scrape_data) ;
140
74
@@ -233,11 +167,11 @@ mod tests {
233
167
mod with_tracker_in_private_mode {
234
168
use std:: str:: FromStr ;
235
169
170
+ use bittorrent_http_tracker_core:: services:: scrape:: ScrapeService ;
236
171
use bittorrent_tracker_core:: authentication;
237
172
use torrust_tracker_primitives:: core:: ScrapeData ;
238
173
239
174
use super :: { initialize_private_tracker, sample_client_ip_sources, sample_scrape_request} ;
240
- use crate :: v1:: handlers:: scrape:: handle_scrape;
241
175
242
176
#[ tokio:: test]
243
177
async fn it_should_return_zeroed_swarm_metadata_when_the_authentication_key_is_missing ( ) {
@@ -246,17 +180,17 @@ mod tests {
246
180
let scrape_request = sample_scrape_request ( ) ;
247
181
let maybe_key = None ;
248
182
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 ( ) ;
260
194
261
195
let expected_scrape_data = ScrapeData :: zeroed ( & scrape_request. info_hashes ) ;
262
196
@@ -271,17 +205,17 @@ mod tests {
271
205
let unregistered_key = authentication:: Key :: from_str ( "YZSl4lMZupRuOpSRC3krIKR5BPB14nrJ" ) . unwrap ( ) ;
272
206
let maybe_key = Some ( unregistered_key) ;
273
207
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 ( ) ;
285
219
286
220
let expected_scrape_data = ScrapeData :: zeroed ( & scrape_request. info_hashes ) ;
287
221
@@ -291,28 +225,28 @@ mod tests {
291
225
292
226
mod with_tracker_in_listed_mode {
293
227
228
+ use bittorrent_http_tracker_core:: services:: scrape:: ScrapeService ;
294
229
use torrust_tracker_primitives:: core:: ScrapeData ;
295
230
296
231
use super :: { initialize_listed_tracker, sample_client_ip_sources, sample_scrape_request} ;
297
- use crate :: v1:: handlers:: scrape:: handle_scrape;
298
232
299
233
#[ tokio:: test]
300
234
async fn it_should_return_zeroed_swarm_metadata_when_the_torrent_is_not_whitelisted ( ) {
301
235
let ( core_tracker_services, core_http_tracker_services) = initialize_listed_tracker ( ) ;
302
236
303
237
let scrape_request = sample_scrape_request ( ) ;
304
238
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 ( ) ;
316
250
317
251
let expected_scrape_data = ScrapeData :: zeroed ( & scrape_request. info_hashes ) ;
318
252
@@ -322,11 +256,11 @@ mod tests {
322
256
323
257
mod with_tracker_on_reverse_proxy {
324
258
259
+ use bittorrent_http_tracker_core:: services:: scrape:: ScrapeService ;
325
260
use bittorrent_http_tracker_protocol:: v1:: responses;
326
261
use bittorrent_http_tracker_protocol:: v1:: services:: peer_ip_resolver:: ClientIpSources ;
327
262
328
263
use super :: { initialize_tracker_on_reverse_proxy, sample_scrape_request} ;
329
- use crate :: v1:: handlers:: scrape:: handle_scrape;
330
264
use crate :: v1:: handlers:: scrape:: tests:: assert_error_response;
331
265
332
266
#[ tokio:: test]
@@ -338,17 +272,17 @@ mod tests {
338
272
connection_info_ip : None ,
339
273
} ;
340
274
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 ( ) ;
352
286
353
287
let error_response = responses:: error:: Error {
354
288
failure_reason : response. to_string ( ) ,
@@ -363,11 +297,11 @@ mod tests {
363
297
364
298
mod with_tracker_not_on_reverse_proxy {
365
299
300
+ use bittorrent_http_tracker_core:: services:: scrape:: ScrapeService ;
366
301
use bittorrent_http_tracker_protocol:: v1:: responses;
367
302
use bittorrent_http_tracker_protocol:: v1:: services:: peer_ip_resolver:: ClientIpSources ;
368
303
369
304
use super :: { initialize_tracker_not_on_reverse_proxy, sample_scrape_request} ;
370
- use crate :: v1:: handlers:: scrape:: handle_scrape;
371
305
use crate :: v1:: handlers:: scrape:: tests:: assert_error_response;
372
306
373
307
#[ tokio:: test]
@@ -379,17 +313,17 @@ mod tests {
379
313
connection_info_ip : None ,
380
314
} ;
381
315
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 ( ) ;
393
327
394
328
let error_response = responses:: error:: Error {
395
329
failure_reason : response. to_string ( ) ,
0 commit comments