aquatic_ws: save peer even if AnnounceRequest.bytes_left is None

This commit is contained in:
Joakim Frostegård 2020-05-15 16:02:49 +02:00
parent 008d8b8eff
commit cb66364fa5
3 changed files with 34 additions and 36 deletions

View file

@ -37,11 +37,11 @@ impl PeerStatus {
#[inline] #[inline]
pub fn from_event_and_bytes_left( pub fn from_event_and_bytes_left(
event: AnnounceEvent, event: AnnounceEvent,
bytes_left: usize opt_bytes_left: Option<usize>
) -> Self { ) -> Self {
if let AnnounceEvent::Stopped = event { if let AnnounceEvent::Stopped = event {
Self::Stopped Self::Stopped
} else if bytes_left == 0 { } else if let Some(0) = opt_bytes_left {
Self::Seeding Self::Seeding
} else { } else {
Self::Leeching Self::Leeching

View file

@ -109,44 +109,41 @@ pub fn handle_announce_requests(
} }
} }
// FIXME: correct to only update when bytes_left is Some? let peer_status = PeerStatus::from_event_and_bytes_left(
if let Some(bytes_left) = request.bytes_left { request.event,
let peer_status = PeerStatus::from_event_and_bytes_left( request.bytes_left
request.event, );
bytes_left
);
let peer = Peer { let peer = Peer {
connection_meta: sender_meta, connection_meta: sender_meta,
status: peer_status, status: peer_status,
valid_until, valid_until,
}; };
let opt_removed_peer = match peer_status { let opt_removed_peer = match peer_status {
PeerStatus::Leeching => { PeerStatus::Leeching => {
torrent_data.num_leechers += 1; torrent_data.num_leechers += 1;
torrent_data.peers.insert(peer_id, peer) torrent_data.peers.insert(peer_id, peer)
}, },
PeerStatus::Seeding => { PeerStatus::Seeding => {
torrent_data.num_seeders += 1; torrent_data.num_seeders += 1;
torrent_data.peers.insert(peer_id, peer) torrent_data.peers.insert(peer_id, peer)
}, },
PeerStatus::Stopped => { PeerStatus::Stopped => {
torrent_data.peers.remove(&peer_id) torrent_data.peers.remove(&peer_id)
}
};
match opt_removed_peer.map(|peer| peer.status){
Some(PeerStatus::Leeching) => {
torrent_data.num_leechers -= 1;
},
Some(PeerStatus::Seeding) => {
torrent_data.num_seeders -= 1;
},
_ => {}
} }
};
match opt_removed_peer.map(|peer| peer.status){
Some(PeerStatus::Leeching) => {
torrent_data.num_leechers -= 1;
},
Some(PeerStatus::Seeding) => {
torrent_data.num_seeders -= 1;
},
_ => {}
} }
// If peer sent offers, send them on to random peers // If peer sent offers, send them on to random peers

View file

@ -103,7 +103,8 @@ pub struct AnnounceRequestOffer {
pub struct AnnounceRequest { pub struct AnnounceRequest {
pub info_hash: InfoHash, pub info_hash: InfoHash,
pub peer_id: PeerId, pub peer_id: PeerId,
/// Just called "left" in protocol /// Just called "left" in protocol. Is set to None in some cases, such as
/// when opening a magnet link
#[serde(rename = "left")] #[serde(rename = "left")]
pub bytes_left: Option<usize>, pub bytes_left: Option<usize>,
/// Can be empty. Then, default is "update" /// Can be empty. Then, default is "update"