untested support for send_metadata_piece
This commit is contained in:
parent
dee8106338
commit
55649e181a
1 changed files with 39 additions and 1 deletions
|
|
@ -58,6 +58,7 @@ use backoff::backoff::Backoff;
|
||||||
use buffers::{ByteBuf, ByteBufOwned};
|
use buffers::{ByteBuf, ByteBufOwned};
|
||||||
use clone_to_owned::CloneToOwned;
|
use clone_to_owned::CloneToOwned;
|
||||||
use librqbit_core::{
|
use librqbit_core::{
|
||||||
|
constants::CHUNK_SIZE,
|
||||||
hash_id::Id20,
|
hash_id::Id20,
|
||||||
lengths::{ChunkInfo, Lengths, ValidPieceIndex},
|
lengths::{ChunkInfo, Lengths, ValidPieceIndex},
|
||||||
spawn_utils::spawn_with_cancel,
|
spawn_utils::spawn_with_cancel,
|
||||||
|
|
@ -66,7 +67,8 @@ use librqbit_core::{
|
||||||
};
|
};
|
||||||
use parking_lot::{RwLock, RwLockReadGuard, RwLockWriteGuard};
|
use parking_lot::{RwLock, RwLockReadGuard, RwLockWriteGuard};
|
||||||
use peer_binary_protocol::{
|
use peer_binary_protocol::{
|
||||||
extended::handshake::ExtendedHandshake, Handshake, Message, MessageOwned, Piece, Request,
|
extended::{handshake::ExtendedHandshake, ut_metadata::UtMetadata, ExtendedMessage},
|
||||||
|
Handshake, Message, MessageOwned, Piece, Request,
|
||||||
};
|
};
|
||||||
use tokio::{
|
use tokio::{
|
||||||
sync::{
|
sync::{
|
||||||
|
|
@ -798,6 +800,12 @@ impl<'a> PeerConnectionHandler for &'a PeerHandler {
|
||||||
Message::Cancel(_) => {
|
Message::Cancel(_) => {
|
||||||
trace!("received \"cancel\", but we don't process it yet")
|
trace!("received \"cancel\", but we don't process it yet")
|
||||||
}
|
}
|
||||||
|
Message::Extended(ExtendedMessage::UtMetadata(UtMetadata::Request(
|
||||||
|
metadata_piece_id,
|
||||||
|
))) => {
|
||||||
|
self.send_metadata_piece(metadata_piece_id)
|
||||||
|
.with_context(|| format!("error sending metadata piece {metadata_piece_id}"))?;
|
||||||
|
}
|
||||||
message => {
|
message => {
|
||||||
warn!("received unsupported message {:?}, ignoring", message);
|
warn!("received unsupported message {:?}, ignoring", message);
|
||||||
}
|
}
|
||||||
|
|
@ -1504,4 +1512,34 @@ impl PeerHandler {
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn send_metadata_piece(&self, piece_id: u32) -> anyhow::Result<()> {
|
||||||
|
let data = &self.state.meta().torrent_bytes;
|
||||||
|
let metadata_size = data.len();
|
||||||
|
if metadata_size == 0 {
|
||||||
|
anyhow::bail!("peer requested for info metadata but we don't have it")
|
||||||
|
}
|
||||||
|
let total_pieces: usize = (metadata_size as u64)
|
||||||
|
.div_ceil(CHUNK_SIZE as u64)
|
||||||
|
.try_into()?;
|
||||||
|
|
||||||
|
if piece_id as usize > total_pieces {
|
||||||
|
bail!("piece out of bounds")
|
||||||
|
}
|
||||||
|
|
||||||
|
let offset = piece_id * CHUNK_SIZE;
|
||||||
|
let end = (offset + CHUNK_SIZE).min((data.len() - 1).try_into()?);
|
||||||
|
let data = data.slice(offset as usize..end as usize);
|
||||||
|
|
||||||
|
self.tx
|
||||||
|
.send(WriterRequest::Message(Message::Extended(
|
||||||
|
ExtendedMessage::UtMetadata(UtMetadata::Data {
|
||||||
|
piece: piece_id,
|
||||||
|
total_size: end - offset,
|
||||||
|
data: data.into(),
|
||||||
|
}),
|
||||||
|
)))
|
||||||
|
.context("error sending UtMetadata: channel closed")?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue