monolith/src/http.rs

69 lines
2.2 KiB
Rust
Raw Normal View History

2020-01-02 16:31:55 +01:00
use crate::utils::{clean_url, data_to_dataurl, is_data_url};
use reqwest::blocking::Client;
use reqwest::header::CONTENT_TYPE;
use std::collections::HashMap;
2019-08-23 05:17:15 +02:00
2019-08-23 20:24:45 +02:00
pub fn retrieve_asset(
cache: &mut HashMap<String, String>,
client: &Client,
2019-08-23 20:24:45 +02:00
url: &str,
as_dataurl: bool,
2019-10-01 05:58:09 +02:00
mime: &str,
opt_silent: bool,
2019-10-01 05:58:09 +02:00
) -> Result<(String, String), reqwest::Error> {
2019-12-12 03:13:11 +01:00
let cache_key = clean_url(&url);
if is_data_url(&url).unwrap() {
2019-10-01 05:58:09 +02:00
Ok((url.to_string(), url.to_string()))
2019-08-23 05:17:15 +02:00
} else {
2019-12-12 03:13:11 +01:00
if cache.contains_key(&cache_key) {
// url is in cache
if !opt_silent {
2019-12-11 07:17:00 +01:00
eprintln!("{} (from cache)", &url);
}
2019-12-12 03:13:11 +01:00
let data = cache.get(&cache_key).unwrap();
Ok((data.to_string(), url.to_string()))
} else {
// url not in cache, we request it
let mut response = client.get(url).send()?;
let res_url = response.url().to_string();
2019-08-24 19:33:24 +02:00
if !opt_silent {
if url == res_url {
2019-12-11 07:17:00 +01:00
eprintln!("{}", &url);
} else {
eprintln!("{} -> {}", &url, &res_url);
}
2019-08-25 17:41:30 +02:00
}
2019-08-23 05:17:15 +02:00
let new_cache_key = clean_url(&res_url);
2019-12-12 03:13:11 +01:00
if as_dataurl {
// Convert response into a byte array
let mut data: Vec<u8> = vec![];
response.copy_to(&mut data)?;
2019-08-23 05:17:15 +02:00
// Attempt to obtain MIME type by reading the Content-Type header
let mimetype = if mime == "" {
response
.headers()
.get(CONTENT_TYPE)
.and_then(|header| header.to_str().ok())
.unwrap_or(&mime)
} else {
mime
};
let dataurl = data_to_dataurl(&mimetype, &data);
// insert in cache
cache.insert(new_cache_key, dataurl.clone());
Ok((dataurl, res_url))
2019-08-23 20:24:45 +02:00
} else {
let content = response.text().unwrap();
// insert in cache
2019-12-12 03:13:11 +01:00
cache.insert(new_cache_key, content.clone());
Ok((content, res_url))
}
2019-08-23 05:17:15 +02:00
}
}
}