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()?)
}