btpeer 0.10.0

Simple CLI tool and library to get peers from TCP/HTTP and UDP BitTorrent trackers
Documentation
pub mod proxy;
pub mod query;
pub mod response;

pub use proxy::Proxy;

use crate::http::response::announce::{Default, I2p};
use anyhow::{Result, bail};
use bendy::decoding::FromBencode;
use reqwest::Client;
use response::Scrape;
use std::{str::FromStr, time::Duration};

pub async fn announce(
    query: &query::Announce,
    timeout: Duration,
    proxy_url: Option<&str>,
) -> Result<Default> {
    let response = client(timeout, proxy_url)?
        .get(query.to_string())
        .send()
        .await?;
    if !response.status().is_success() {
        bail!("Tracker returned status: {}", response.status());
    }
    Ok(Default::from_bencode(&response.bytes().await?)?)
}

pub async fn announce_i2p(
    query: &query::Announce,
    timeout: Duration,
    proxy_url: Option<&str>,
) -> Result<I2p> {
    let response = client(timeout, proxy_url)?
        .get(query.to_string())
        .send()
        .await?;

    if !response.status().is_success() {
        bail!("Tracker returned status: {}", response.status());
    }

    Ok(I2p::from_bencode(&response.bytes().await?)?)
}

pub async fn scrape(
    query: &query::Scrape,
    timeout: Duration,
    proxy_url: Option<&str>,
) -> Result<Scrape> {
    let response = client(timeout, proxy_url)?
        .get(query.to_string())
        .send()
        .await?;

    if !response.status().is_success() {
        bail!("Tracker returned status: {}", response.status());
    }

    Ok(Scrape::from_bencode(&response.bytes().await?)?)
}

pub fn client(timeout: Duration, proxy_url: Option<&str>) -> Result<Client> {
    let c = Client::builder().timeout(timeout);

    Ok(match proxy_url {
        Some(p) => c.proxy(Proxy::from_str(p)?.0),
        None => c,
    }
    .build()?)
}