dwldutil 3.0.0

A utility for parallel downloading
Documentation
use surf::middleware::{Middleware, Next};
use surf::{Client, Request, Response, Result, StatusCode, Url};

pub struct RedirectMiddleware {
    max_redirects: usize,
}

impl RedirectMiddleware {
    pub fn new(max_redirects: usize) -> Self {
        Self { max_redirects }
    }
}

#[surf::utils::async_trait]
impl Middleware for RedirectMiddleware {
    async fn handle(&self, req: Request, client: Client, _: Next<'_>) -> Result<Response> {
        let mut req = req;
        for _ in 0..self.max_redirects {
            let res = client.send(req.clone()).await?;
            if res.status().is_redirection() {
                if let Some(location) = res.header("Location") {
                    req = Request::new(req.method(), Url::parse(location.last().as_str()).unwrap());
                    continue;
                }
            }
            return Ok(res);
        }
        Err(surf::Error::from_str(
            StatusCode::TooManyRequests,
            "Too many redirects, Increase max_redirections in DLStartConfig",
        ))
    }
}