Skip to content

Commit 096d503

Browse files
committed
refactor: [torrust#1270] inline http tracker announce invoke fn
1 parent dbee7ad commit 096d503

File tree

2 files changed

+106
-89
lines changed

2 files changed

+106
-89
lines changed

packages/http-protocol/src/v1/requests/announce.rs

+11
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,17 @@ impl fmt::Display for Event {
183183
}
184184
}
185185

186+
impl From<aquatic_udp_protocol::request::AnnounceEvent> for Event {
187+
fn from(value: aquatic_udp_protocol::request::AnnounceEvent) -> Self {
188+
match value {
189+
AnnounceEvent::Started => Self::Started,
190+
AnnounceEvent::Stopped => Self::Stopped,
191+
AnnounceEvent::Completed => Self::Completed,
192+
AnnounceEvent::None => panic!("can't convert announce event from aquatic for None variant"),
193+
}
194+
}
195+
}
196+
186197
/// Whether the `announce` response should be in compact mode or not.
187198
///
188199
/// Depending on the value of this param, the tracker will return a different

src/packages/http_tracker_core/services/announce.rs

+95-89
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,11 @@ use std::sync::Arc;
1313
use bittorrent_http_protocol::v1::requests::announce::{peer_from_request, Announce};
1414
use bittorrent_http_protocol::v1::responses;
1515
use bittorrent_http_protocol::v1::services::peer_ip_resolver::{self, ClientIpSources};
16-
use bittorrent_primitives::info_hash::InfoHash;
1716
use bittorrent_tracker_core::announce_handler::{AnnounceHandler, PeersWanted};
1817
use bittorrent_tracker_core::authentication::service::AuthenticationService;
19-
use bittorrent_tracker_core::error::AnnounceError;
2018
use bittorrent_tracker_core::whitelist;
2119
use torrust_tracker_configuration::Core;
2220
use torrust_tracker_primitives::core::AnnounceData;
23-
use torrust_tracker_primitives::peer;
2421

2522
use crate::packages::http_tracker_core;
2623

@@ -69,34 +66,11 @@ pub async fn handle_announce(
6966
None => PeersWanted::AsManyAsPossible,
7067
};
7168

72-
let announce_data = invoke(
73-
announce_handler.clone(),
74-
opt_http_stats_event_sender.clone(),
75-
announce_request.info_hash,
76-
&mut peer,
77-
&peers_wanted,
78-
)
79-
.await
80-
.map_err(responses::error::Error::from)?;
81-
82-
Ok(announce_data)
83-
}
84-
85-
/// # Errors
86-
///
87-
/// This function will return an error if the announce requests failed.
88-
pub async fn invoke(
89-
announce_handler: Arc<AnnounceHandler>,
90-
opt_http_stats_event_sender: Arc<Option<Box<dyn http_tracker_core::statistics::event::sender::Sender>>>,
91-
info_hash: InfoHash,
92-
peer: &mut peer::Peer,
93-
peers_wanted: &PeersWanted,
94-
) -> Result<AnnounceData, AnnounceError> {
9569
let original_peer_ip = peer.peer_addr.ip();
9670

9771
// The tracker could change the original peer ip
9872
let announce_data = announce_handler
99-
.announce(&info_hash, peer, &original_peer_ip, peers_wanted)
73+
.announce(&announce_request.info_hash, &mut peer, &original_peer_ip, &peers_wanted)
10074
.await?;
10175

10276
if let Some(http_stats_event_sender) = opt_http_stats_event_sender.as_deref() {
@@ -123,34 +97,45 @@ mod tests {
12397
use std::sync::Arc;
12498

12599
use aquatic_udp_protocol::{AnnounceEvent, NumberOfBytes, PeerId};
100+
use bittorrent_http_protocol::v1::requests::announce::Announce;
101+
use bittorrent_http_protocol::v1::services::peer_ip_resolver::ClientIpSources;
126102
use bittorrent_tracker_core::announce_handler::AnnounceHandler;
103+
use bittorrent_tracker_core::authentication::key::repository::in_memory::InMemoryKeyRepository;
104+
use bittorrent_tracker_core::authentication::service::AuthenticationService;
127105
use bittorrent_tracker_core::databases::setup::initialize_database;
128106
use bittorrent_tracker_core::torrent::repository::in_memory::InMemoryTorrentRepository;
129107
use bittorrent_tracker_core::torrent::repository::persisted::DatabasePersistentTorrentRepository;
130108
use bittorrent_tracker_core::whitelist::authorization::WhitelistAuthorization;
131109
use bittorrent_tracker_core::whitelist::repository::in_memory::InMemoryWhitelist;
132-
use torrust_tracker_configuration::Core;
110+
use torrust_tracker_configuration::{Configuration, Core};
111+
use torrust_tracker_primitives::peer::Peer;
133112
use torrust_tracker_primitives::{peer, DurationSinceUnixEpoch};
134113
use torrust_tracker_test_helpers::configuration;
135114

136115
struct CoreTrackerServices {
137116
pub core_config: Arc<Core>,
138117
pub announce_handler: Arc<AnnounceHandler>,
118+
pub authentication_service: Arc<AuthenticationService>,
119+
pub whitelist_authorization: Arc<WhitelistAuthorization>,
139120
}
140121

141122
struct CoreHttpTrackerServices {
142123
pub http_stats_event_sender: Arc<Option<Box<dyn http_tracker_core::statistics::event::sender::Sender>>>,
143124
}
144125

145126
fn initialize_core_tracker_services() -> (CoreTrackerServices, CoreHttpTrackerServices) {
146-
let config = configuration::ephemeral_public();
127+
initialize_core_tracker_services_with_config(&configuration::ephemeral_public())
128+
}
147129

130+
fn initialize_core_tracker_services_with_config(config: &Configuration) -> (CoreTrackerServices, CoreHttpTrackerServices) {
148131
let core_config = Arc::new(config.core.clone());
149132
let database = initialize_database(&config.core);
150133
let in_memory_torrent_repository = Arc::new(InMemoryTorrentRepository::default());
151134
let db_torrent_repository = Arc::new(DatabasePersistentTorrentRepository::new(&database));
152135
let in_memory_whitelist = Arc::new(InMemoryWhitelist::default());
153136
let whitelist_authorization = Arc::new(WhitelistAuthorization::new(&config.core, &in_memory_whitelist.clone()));
137+
let in_memory_key_repository = Arc::new(InMemoryKeyRepository::default());
138+
let authentication_service = Arc::new(AuthenticationService::new(&core_config, &in_memory_key_repository));
154139

155140
let announce_handler = Arc::new(AnnounceHandler::new(
156141
&config.core,
@@ -169,6 +154,8 @@ mod tests {
169154
CoreTrackerServices {
170155
core_config,
171156
announce_handler,
157+
authentication_service,
158+
whitelist_authorization,
172159
},
173160
CoreHttpTrackerServices { http_stats_event_sender },
174161
)
@@ -199,11 +186,33 @@ mod tests {
199186
}
200187
}
201188

189+
fn sample_announce_request_for_peer(peer: Peer) -> (Announce, ClientIpSources) {
190+
let announce_request = Announce {
191+
info_hash: sample_info_hash(),
192+
peer_id: peer.peer_id,
193+
port: peer.peer_addr.port(),
194+
uploaded: Some(peer.uploaded),
195+
downloaded: Some(peer.downloaded),
196+
left: Some(peer.left),
197+
event: Some(peer.event.into()),
198+
compact: None,
199+
numwant: None,
200+
};
201+
202+
let client_ip_sources = ClientIpSources {
203+
right_most_x_forwarded_for: None,
204+
connection_info_ip: Some(peer.peer_addr.ip()),
205+
};
206+
207+
(announce_request, client_ip_sources)
208+
}
209+
202210
use futures::future::BoxFuture;
203211
use mockall::mock;
204212
use tokio::sync::mpsc::error::SendError;
205213

206214
use crate::packages::http_tracker_core;
215+
use crate::servers::http::test_helpers::tests::sample_info_hash;
207216

208217
mock! {
209218
HttpStatsEventSender {}
@@ -217,55 +226,37 @@ mod tests {
217226
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr};
218227
use std::sync::Arc;
219228

220-
use bittorrent_tracker_core::announce_handler::{AnnounceHandler, PeersWanted};
221-
use bittorrent_tracker_core::databases::setup::initialize_database;
222-
use bittorrent_tracker_core::torrent::repository::in_memory::InMemoryTorrentRepository;
223-
use bittorrent_tracker_core::torrent::repository::persisted::DatabasePersistentTorrentRepository;
224-
use bittorrent_tracker_core::whitelist::authorization::WhitelistAuthorization;
225-
use bittorrent_tracker_core::whitelist::repository::in_memory::InMemoryWhitelist;
226229
use mockall::predicate::eq;
230+
use torrust_tracker_configuration::Configuration;
227231
use torrust_tracker_primitives::core::AnnounceData;
228232
use torrust_tracker_primitives::peer;
229233
use torrust_tracker_primitives::swarm_metadata::SwarmMetadata;
230234
use torrust_tracker_test_helpers::configuration;
231235

232236
use super::{sample_peer_using_ipv4, sample_peer_using_ipv6};
233237
use crate::packages::http_tracker_core;
234-
use crate::packages::http_tracker_core::services::announce::invoke;
238+
use crate::packages::http_tracker_core::services::announce::handle_announce;
235239
use crate::packages::http_tracker_core::services::announce::tests::{
236-
initialize_core_tracker_services, sample_peer, MockHttpStatsEventSender,
240+
initialize_core_tracker_services, initialize_core_tracker_services_with_config, sample_announce_request_for_peer,
241+
sample_peer, MockHttpStatsEventSender,
237242
};
238-
use crate::servers::http::test_helpers::tests::sample_info_hash;
239-
240-
fn initialize_announce_handler() -> Arc<AnnounceHandler> {
241-
let config = configuration::ephemeral();
242-
243-
let database = initialize_database(&config.core);
244-
let in_memory_torrent_repository = Arc::new(InMemoryTorrentRepository::default());
245-
let db_torrent_repository = Arc::new(DatabasePersistentTorrentRepository::new(&database));
246-
let in_memory_whitelist = Arc::new(InMemoryWhitelist::default());
247-
let whitelist_authorization = Arc::new(WhitelistAuthorization::new(&config.core, &in_memory_whitelist.clone()));
248-
249-
Arc::new(AnnounceHandler::new(
250-
&config.core,
251-
&whitelist_authorization,
252-
&in_memory_torrent_repository,
253-
&db_torrent_repository,
254-
))
255-
}
256243

257244
#[tokio::test]
258245
async fn it_should_return_the_announce_data() {
259246
let (core_tracker_services, core_http_tracker_services) = initialize_core_tracker_services();
260247

261-
let mut peer = sample_peer();
248+
let peer = sample_peer();
262249

263-
let announce_data = invoke(
264-
core_tracker_services.announce_handler.clone(),
265-
core_http_tracker_services.http_stats_event_sender.clone(),
266-
sample_info_hash(),
267-
&mut peer,
268-
&PeersWanted::AsManyAsPossible,
250+
let (announce_request, client_ip_sources) = sample_announce_request_for_peer(peer);
251+
252+
let announce_data = handle_announce(
253+
&core_tracker_services.core_config,
254+
&core_tracker_services.announce_handler,
255+
&core_tracker_services.authentication_service,
256+
&core_tracker_services.whitelist_authorization,
257+
&core_http_tracker_services.http_stats_event_sender,
258+
&announce_request,
259+
&client_ip_sources,
269260
)
270261
.await
271262
.unwrap();
@@ -294,28 +285,32 @@ mod tests {
294285
let http_stats_event_sender: Arc<Option<Box<dyn http_tracker_core::statistics::event::sender::Sender>>> =
295286
Arc::new(Some(Box::new(http_stats_event_sender_mock)));
296287

297-
let announce_handler = initialize_announce_handler();
288+
let (core_tracker_services, mut core_http_tracker_services) = initialize_core_tracker_services();
289+
core_http_tracker_services.http_stats_event_sender = http_stats_event_sender;
298290

299-
let mut peer = sample_peer_using_ipv4();
291+
let peer = sample_peer_using_ipv4();
300292

301-
let _announce_data = invoke(
302-
announce_handler,
303-
http_stats_event_sender,
304-
sample_info_hash(),
305-
&mut peer,
306-
&PeersWanted::AsManyAsPossible,
293+
let (announce_request, client_ip_sources) = sample_announce_request_for_peer(peer);
294+
295+
let _announce_data = handle_announce(
296+
&core_tracker_services.core_config,
297+
&core_tracker_services.announce_handler,
298+
&core_tracker_services.authentication_service,
299+
&core_tracker_services.whitelist_authorization,
300+
&core_http_tracker_services.http_stats_event_sender,
301+
&announce_request,
302+
&client_ip_sources,
307303
)
308304
.await
309305
.unwrap();
310306
}
311307

312-
fn tracker_with_an_ipv6_external_ip() -> Arc<AnnounceHandler> {
308+
fn tracker_with_an_ipv6_external_ip() -> Configuration {
313309
let mut configuration = configuration::ephemeral();
314310
configuration.core.net.external_ip = Some(IpAddr::V6(Ipv6Addr::new(
315311
0x6969, 0x6969, 0x6969, 0x6969, 0x6969, 0x6969, 0x6969, 0x6969,
316312
)));
317-
318-
initialize_announce_handler()
313+
configuration
319314
}
320315

321316
fn peer_with_the_ipv4_loopback_ip() -> peer::Peer {
@@ -340,16 +335,22 @@ mod tests {
340335
let http_stats_event_sender: Arc<Option<Box<dyn http_tracker_core::statistics::event::sender::Sender>>> =
341336
Arc::new(Some(Box::new(http_stats_event_sender_mock)));
342337

343-
let mut peer = peer_with_the_ipv4_loopback_ip();
338+
let (core_tracker_services, mut core_http_tracker_services) =
339+
initialize_core_tracker_services_with_config(&tracker_with_an_ipv6_external_ip());
340+
core_http_tracker_services.http_stats_event_sender = http_stats_event_sender;
344341

345-
let announce_handler = tracker_with_an_ipv6_external_ip();
342+
let peer = peer_with_the_ipv4_loopback_ip();
346343

347-
let _announce_data = invoke(
348-
announce_handler,
349-
http_stats_event_sender,
350-
sample_info_hash(),
351-
&mut peer,
352-
&PeersWanted::AsManyAsPossible,
344+
let (announce_request, client_ip_sources) = sample_announce_request_for_peer(peer);
345+
346+
let _announce_data = handle_announce(
347+
&core_tracker_services.core_config,
348+
&core_tracker_services.announce_handler,
349+
&core_tracker_services.authentication_service,
350+
&core_tracker_services.whitelist_authorization,
351+
&core_http_tracker_services.http_stats_event_sender,
352+
&announce_request,
353+
&client_ip_sources,
353354
)
354355
.await
355356
.unwrap();
@@ -367,16 +368,21 @@ mod tests {
367368
let http_stats_event_sender: Arc<Option<Box<dyn http_tracker_core::statistics::event::sender::Sender>>> =
368369
Arc::new(Some(Box::new(http_stats_event_sender_mock)));
369370

370-
let announce_handler = initialize_announce_handler();
371+
let (core_tracker_services, mut core_http_tracker_services) = initialize_core_tracker_services();
372+
core_http_tracker_services.http_stats_event_sender = http_stats_event_sender;
371373

372-
let mut peer = sample_peer_using_ipv6();
374+
let peer = sample_peer_using_ipv6();
373375

374-
let _announce_data = invoke(
375-
announce_handler,
376-
http_stats_event_sender,
377-
sample_info_hash(),
378-
&mut peer,
379-
&PeersWanted::AsManyAsPossible,
376+
let (announce_request, client_ip_sources) = sample_announce_request_for_peer(peer);
377+
378+
let _announce_data = handle_announce(
379+
&core_tracker_services.core_config,
380+
&core_tracker_services.announce_handler,
381+
&core_tracker_services.authentication_service,
382+
&core_tracker_services.whitelist_authorization,
383+
&core_http_tracker_services.http_stats_event_sender,
384+
&announce_request,
385+
&client_ip_sources,
380386
)
381387
.await
382388
.unwrap();

0 commit comments

Comments
 (0)