2020-06-24 09:16:40 +02:00
|
|
|
use base64;
|
2021-03-11 23:44:02 +01:00
|
|
|
use url::{form_urlencoded, Url};
|
2020-06-24 09:16:40 +02:00
|
|
|
|
2021-06-08 14:30:15 +02:00
|
|
|
use crate::utils::{detect_media_type, parse_content_type};
|
2020-06-24 09:16:40 +02:00
|
|
|
|
2021-03-11 23:44:02 +01:00
|
|
|
pub fn clean_url(url: Url) -> Url {
|
|
|
|
let mut url = url.clone();
|
2020-06-24 09:16:40 +02:00
|
|
|
|
2021-03-11 23:44:02 +01:00
|
|
|
// Clear fragment (if any)
|
2020-06-24 09:16:40 +02:00
|
|
|
url.set_fragment(None);
|
|
|
|
|
2021-03-11 23:44:02 +01:00
|
|
|
url
|
2020-06-24 09:16:40 +02:00
|
|
|
}
|
|
|
|
|
2021-06-09 00:54:16 +02:00
|
|
|
pub fn create_data_url(media_type: &str, charset: &str, data: &[u8], final_asset_url: &Url) -> Url {
|
|
|
|
// TODO: move this block out of this function
|
2020-06-24 09:16:40 +02:00
|
|
|
let media_type: String = if media_type.is_empty() {
|
2021-03-11 23:44:02 +01:00
|
|
|
detect_media_type(data, &final_asset_url)
|
2020-06-24 09:16:40 +02:00
|
|
|
} else {
|
|
|
|
media_type.to_string()
|
|
|
|
};
|
|
|
|
|
2021-03-11 23:44:02 +01:00
|
|
|
let mut data_url: Url = Url::parse("data:,").unwrap();
|
2020-06-24 09:16:40 +02:00
|
|
|
|
2021-06-09 00:54:16 +02:00
|
|
|
let c: String =
|
|
|
|
if !charset.trim().is_empty() && !charset.trim().eq_ignore_ascii_case("US-ASCII") {
|
|
|
|
format!(";charset={}", charset.trim())
|
|
|
|
} else {
|
|
|
|
str!()
|
|
|
|
};
|
|
|
|
|
|
|
|
data_url.set_path(format!("{}{};base64,{}", media_type, c, base64::encode(data)).as_str());
|
2020-06-24 09:16:40 +02:00
|
|
|
|
2021-03-11 23:44:02 +01:00
|
|
|
data_url
|
2020-06-24 09:16:40 +02:00
|
|
|
}
|
|
|
|
|
2021-03-11 23:44:02 +01:00
|
|
|
pub fn is_url_and_has_protocol(input: &str) -> bool {
|
|
|
|
match Url::parse(&input) {
|
|
|
|
Ok(parsed_url) => {
|
|
|
|
return parsed_url.scheme().len() > 0;
|
|
|
|
}
|
|
|
|
Err(_) => {
|
|
|
|
return false;
|
|
|
|
}
|
2020-06-24 09:16:40 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-06-08 14:30:15 +02:00
|
|
|
pub fn parse_data_url(url: &Url) -> (String, String, Vec<u8>) {
|
2021-03-11 23:44:02 +01:00
|
|
|
let path: String = url.path().to_string();
|
2020-11-23 06:12:26 +01:00
|
|
|
let comma_loc: usize = path.find(',').unwrap_or(path.len());
|
|
|
|
|
2021-06-08 14:30:15 +02:00
|
|
|
// Split data URL into meta data and raw data
|
|
|
|
let content_type: String = path.chars().take(comma_loc).collect();
|
|
|
|
let data: String = path.chars().skip(comma_loc + 1).collect();
|
2020-11-23 06:12:26 +01:00
|
|
|
|
2021-06-08 14:30:15 +02:00
|
|
|
// Parse meta data
|
|
|
|
let (media_type, charset, is_base64) = parse_content_type(&content_type);
|
2020-11-23 06:12:26 +01:00
|
|
|
|
2021-06-08 14:30:15 +02:00
|
|
|
// Parse raw data into vector of bytes
|
|
|
|
let text: String = percent_decode(data);
|
|
|
|
let blob: Vec<u8> = if is_base64 {
|
2020-11-23 06:12:26 +01:00
|
|
|
base64::decode(&text).unwrap_or(vec![])
|
|
|
|
} else {
|
|
|
|
text.as_bytes().to_vec()
|
|
|
|
};
|
|
|
|
|
2021-06-08 14:30:15 +02:00
|
|
|
(media_type, charset, blob)
|
2020-11-23 06:12:26 +01:00
|
|
|
}
|
|
|
|
|
2021-03-11 23:44:02 +01:00
|
|
|
pub fn percent_decode(input: String) -> String {
|
|
|
|
let input: String = input.replace("+", "%2B");
|
2020-06-24 09:16:40 +02:00
|
|
|
|
2021-03-11 23:44:02 +01:00
|
|
|
form_urlencoded::parse(input.as_bytes())
|
|
|
|
.map(|(key, val)| {
|
|
|
|
[
|
|
|
|
key.to_string(),
|
|
|
|
if val.to_string().len() == 0 {
|
|
|
|
str!()
|
|
|
|
} else {
|
|
|
|
str!('=')
|
|
|
|
},
|
|
|
|
val.to_string(),
|
|
|
|
]
|
|
|
|
.concat()
|
|
|
|
})
|
|
|
|
.collect()
|
2020-06-24 09:16:40 +02:00
|
|
|
}
|
|
|
|
|
2021-03-11 23:44:02 +01:00
|
|
|
pub fn percent_encode(input: String) -> String {
|
|
|
|
form_urlencoded::byte_serialize(input.as_bytes()).collect()
|
|
|
|
}
|
2020-06-24 09:16:40 +02:00
|
|
|
|
2021-03-11 23:44:02 +01:00
|
|
|
pub fn resolve_url(from: &Url, to: &str) -> Url {
|
|
|
|
match Url::parse(&to) {
|
|
|
|
Ok(parsed_url) => parsed_url,
|
|
|
|
Err(_) => match from.join(to) {
|
|
|
|
Ok(joined) => joined,
|
|
|
|
Err(_) => Url::parse("data:,").unwrap(),
|
|
|
|
},
|
2020-06-24 09:16:40 +02:00
|
|
|
}
|
|
|
|
}
|