Skip to main content

MetadataDownloader

Struct MetadataDownloader 

Source
pub struct MetadataDownloader { /* private fields */ }
Expand description

State machine for downloading torrent metadata via BEP 9 (magnet links).

Metadata is split into 16 KiB pieces. Once all pieces are received, they are assembled and verified against the info_hash.

Supports full-redundancy parallel fetch: every peer that advertises ut_metadata is sent requests for ALL missing pieces. The first complete set (SHA1-verified) wins.

Implementations§

Source§

impl MetadataDownloader

Source

pub fn new(info_hash: Id20) -> Self

Create a new downloader with no size known yet.

Source

pub fn set_total_size(&mut self, size: u64)

Set the total metadata size and calculate the number of pieces.

Source

pub fn piece_received(&mut self, piece: u32, data: Bytes) -> bool

Store a received piece. Returns true if all pieces have been received.

Source

pub fn assemble_and_verify(&self) -> Result<Vec<u8>>

Concatenate all pieces in order and verify the SHA1 hash matches info_hash.

Returns the assembled metadata bytes on success.

§Errors

Returns an error if the reassembled metadata’s SHA-1 does not match the info-hash.

Source

pub fn missing_pieces(&self) -> Vec<u32>

Return sorted list of piece indices we don’t have yet.

Returns an empty vec if num_pieces is not yet known.

Source

pub fn mark_rejected(&mut self, peer: SocketAddr)

Mark a peer as having rejected metadata requests.

The peer is added to the rejected set and removed from the active requested set. No further requests will be sent to this peer.

Source

pub fn is_rejected(&self, peer: &SocketAddr) -> bool

Check whether a peer has been rejected.

Source

pub fn request_all_from_peer(&mut self, peer: SocketAddr) -> Vec<u32>

Request all missing pieces from a peer (full redundancy).

Returns the list of piece indices to request from this peer. Skips pieces we already have and rejects requests to blacklisted peers. Records the peer in requested_peers and updates piece_request_times.

Source

pub fn timed_out_pieces(&self) -> Vec<u32>

Return piece indices whose last request time exceeds their per-piece backoff timeout. Backoff is exponential: min(60s, 5s * 2^retry_count).

Source

pub fn reset_request_time(&mut self, piece: u32)

Reset the request time for a piece and increment its retry count.

Source

pub fn has_active_peers(&self) -> bool

Whether any non-rejected peers have outstanding requests.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more