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}