pget/download/
network.rs

1extern crate reqwest;
2
3use reqwest::header::HeaderMap;
4
5use self::reqwest::header;
6use self::reqwest::Client;
7use self::reqwest::Response;
8
9const CONTENT_RANGE: &str = "Content-Range";
10pub struct Network {
11    pub client: Client,
12}
13
14impl Default for Network {
15    fn default() -> Network {
16        Network {
17            client: Client::new(),
18        }
19    }
20}
21
22impl Network {
23    pub async fn make_request(
24        &self,
25        url: &String,
26        range_opt: Option<String>,
27    ) -> Result<Response, reqwest::Error> {
28        let request = if let Some(range) = range_opt {
29            self.client.get(url).header(header::RANGE, range)
30        } else {
31            self.client.get(url)
32        };
33
34        return request.send().await;
35    }
36
37    pub async fn get_content_length(&self, url: &String) -> Result<Option<u64>, reqwest::Error> {
38        let res = self
39            .make_request(url, Some("bytes=0-0".to_string()))
40            .await?;
41        let headers = res.headers();
42        let content_range = get_length_from_meta(headers);
43        Ok(content_range)
44    }
45}
46
47fn get_length_from_meta(headers: &HeaderMap) -> Option<u64> {
48    let content_range = headers.get(CONTENT_RANGE)?;
49    let size = content_range
50        .to_str()
51        .ok()?
52        .split('/')
53        .last()?
54        .parse::<u64>()
55        .ok()?;
56    Some(size)
57}