Skip to content

Commit cecbc17

Browse files
committed
refactor: extract duplicate code from announce request handlers
1 parent 156ac4d commit cecbc17

File tree

5 files changed

+39
-23
lines changed

5 files changed

+39
-23
lines changed

src/http/warp_implementation/handlers.rs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,9 @@ pub async fn handle_announce(
4747

4848
authenticate(&info_hash, &auth_key, tracker.clone()).await?;
4949

50-
let peer_ip = tracker.assign_ip_address_to_peer(&remote_client_ip);
50+
let mut peer = peer_builder::from_request(&announce_request, &remote_client_ip);
5151

52-
let peer = peer_builder::from_request(&announce_request, &peer_ip);
53-
54-
let torrent_stats = tracker.update_torrent_with_peer_and_get_stats(&info_hash, &peer).await;
55-
56-
let peers = tracker.get_other_peers(&info_hash, &peer.peer_addr).await;
52+
let response = tracker.announce(&info_hash, &mut peer, &remote_client_ip).await;
5753

5854
match remote_client_ip {
5955
IpAddr::V4(_) => {
@@ -66,8 +62,8 @@ pub async fn handle_announce(
6662

6763
send_announce_response(
6864
&announce_request,
69-
&torrent_stats,
70-
&peers,
65+
&response.swam_stats,
66+
&response.peers,
7167
tracker.config.announce_interval,
7268
tracker.config.min_announce_interval,
7369
)

src/tracker/mod.rs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ use tokio::sync::mpsc::error::SendError;
1717
use tokio::sync::{RwLock, RwLockReadGuard};
1818

1919
use self::error::Error;
20+
use self::peer::Peer;
21+
use self::torrent::SwamStats;
2022
use crate::config::Configuration;
2123
use crate::databases::driver::Driver;
2224
use crate::databases::{self, Database};
@@ -41,6 +43,11 @@ pub struct TorrentsMetrics {
4143
pub torrents: u64,
4244
}
4345

46+
pub struct AnnounceResponse {
47+
pub peers: Vec<Peer>,
48+
pub swam_stats: SwamStats,
49+
}
50+
4451
impl Tracker {
4552
/// # Errors
4653
///
@@ -76,7 +83,18 @@ impl Tracker {
7683
self.mode == mode::Mode::Listed || self.mode == mode::Mode::PrivateListed
7784
}
7885

79-
/// It assigns a socket address to the peer
86+
/// It handles an announce request
87+
pub async fn announce(&self, info_hash: &InfoHash, peer: &mut Peer, remote_client_ip: &IpAddr) -> AnnounceResponse {
88+
peer.change_ip(&self.assign_ip_address_to_peer(remote_client_ip));
89+
90+
let swam_stats = self.update_torrent_with_peer_and_get_stats(info_hash, peer).await;
91+
92+
let peers = self.get_other_peers(info_hash, &peer.peer_addr).await;
93+
94+
AnnounceResponse { peers, swam_stats }
95+
}
96+
97+
/// It assigns an IP address to the peer
8098
#[must_use]
8199
pub fn assign_ip_address_to_peer(&self, remote_client_ip: &IpAddr) -> IpAddr {
82100
assign_ip_address_to_peer(remote_client_ip, self.config.get_ext_ip())

src/tracker/peer.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::net::SocketAddr;
1+
use std::net::{IpAddr, SocketAddr};
22
use std::panic::Location;
33

44
use aquatic_udp_protocol::{AnnounceEvent, NumberOfBytes};
@@ -31,6 +31,10 @@ impl Peer {
3131
pub fn is_seeder(&self) -> bool {
3232
self.left.0 <= 0 && self.event != AnnounceEvent::Stopped
3333
}
34+
35+
pub fn change_ip(&mut self, new_ip: &IpAddr) {
36+
self.peer_addr = SocketAddr::new(*new_ip, self.peer_addr.port());
37+
}
3438
}
3539

3640
#[derive(PartialEq, Eq, Hash, Clone, Debug, PartialOrd, Ord, Copy)]

src/udp/handlers.rs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -118,13 +118,9 @@ pub async fn handle_announce(
118118

119119
authenticate(&info_hash, tracker.clone()).await?;
120120

121-
let peer_ip = tracker.assign_ip_address_to_peer(&remote_client_ip);
121+
let mut peer = peer_builder::from_request(&wrapped_announce_request, &remote_client_ip);
122122

123-
let peer = peer_builder::from_request(&wrapped_announce_request, &peer_ip);
124-
125-
let torrent_stats = tracker.update_torrent_with_peer_and_get_stats(&info_hash, &peer).await;
126-
127-
let peers = tracker.get_other_peers(&info_hash, &peer.peer_addr).await;
123+
let response = tracker.announce(&info_hash, &mut peer, &remote_client_ip).await;
128124

129125
match remote_client_ip {
130126
IpAddr::V4(_) => {
@@ -140,9 +136,10 @@ pub async fn handle_announce(
140136
Response::from(AnnounceResponse {
141137
transaction_id: wrapped_announce_request.announce_request.transaction_id,
142138
announce_interval: AnnounceInterval(i64::from(tracker.config.announce_interval) as i32),
143-
leechers: NumberOfPeers(i64::from(torrent_stats.leechers) as i32),
144-
seeders: NumberOfPeers(i64::from(torrent_stats.seeders) as i32),
145-
peers: peers
139+
leechers: NumberOfPeers(i64::from(response.swam_stats.leechers) as i32),
140+
seeders: NumberOfPeers(i64::from(response.swam_stats.seeders) as i32),
141+
peers: response
142+
.peers
146143
.iter()
147144
.filter_map(|peer| {
148145
if let IpAddr::V4(ip) = peer.peer_addr.ip() {
@@ -160,9 +157,10 @@ pub async fn handle_announce(
160157
Response::from(AnnounceResponse {
161158
transaction_id: wrapped_announce_request.announce_request.transaction_id,
162159
announce_interval: AnnounceInterval(i64::from(tracker.config.announce_interval) as i32),
163-
leechers: NumberOfPeers(i64::from(torrent_stats.leechers) as i32),
164-
seeders: NumberOfPeers(i64::from(torrent_stats.seeders) as i32),
165-
peers: peers
160+
leechers: NumberOfPeers(i64::from(response.swam_stats.leechers) as i32),
161+
seeders: NumberOfPeers(i64::from(response.swam_stats.seeders) as i32),
162+
peers: response
163+
.peers
166164
.iter()
167165
.filter_map(|peer| {
168166
if let IpAddr::V6(ip) = peer.peer_addr.ip() {

src/udp/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
pub mod connection_cookie;
22
pub mod error;
33
pub mod handlers;
4+
pub mod peer_builder;
45
pub mod request;
56
pub mod server;
6-
pub mod peer_builder;
77

88
pub type Bytes = u64;
99
pub type Port = u16;

0 commit comments

Comments
 (0)