///|
fn ext_from_url(url : String) -> String {
let sv = url[:]
let query_idx = sv.find("?")
let hash_idx = sv.find("#")
let frag_pos = match (query_idx, hash_idx) {
(Some(qi), Some(hi)) => qi.min(hi)
(Some(qi), None) => qi
(None, Some(hi)) => hi
(None, None) => url.length()
}
let last_slash = sv.sub(start=0, end=frag_pos).rev_find("/")
let base_start = match last_slash {
Some(pos) => pos + 1
None => 0
}
let region = sv[base_start:frag_pos]
let dot_in_region = region.rev_find(".")
match dot_in_region {
Some(di) => sv[base_start + di:frag_pos].to_owned().to_lower()
None => ""
}
}
///|
let mime_map : Map[String, String] = {
".png": "image/png",
".flv": "video/x-flv",
".jpeg": "image/jpeg",
".jpg": "image/jpeg",
".gif": "image/gif",
".mp3": "audio/mpeg",
".mp4": "video/mp4",
".m4a": "audio/mp4",
".m4b": "audio/mp4",
".m4v": "video/mp4",
".aac": "audio/aac",
".flac": "audio/flac",
".opus": "audio/opus",
".avif": "image/avif",
".webp": "image/webp",
".svg": "image/svg+xml",
".webm": "video/webm",
".ogg": "audio/ogg",
".oga": "audio/ogg",
".ogv": "video/ogg",
".wav": "audio/wav",
".pdf": "application/pdf",
}
///|
fn mime_from_url(url : String) -> String {
let ext = ext_from_url(url)
match mime_map.get(ext) {
Some(m) => m
None => "application/octet-stream"
}
}