use std::path::{Component, Path};
use super::ServeError;
pub fn content_type_for_path(p: &Path) -> super::ContentType {
let ext = p.extension().and_then(|s| s.to_str()).map(str::to_ascii_lowercase);
match ext.as_deref() {
Some("html") | Some("htm") => super::ContentType::Html,
Some("css") => super::ContentType::Css,
Some("js") | Some("mjs") => super::ContentType::Js,
Some("json") => super::ContentType::Json,
Some("png") => super::ContentType::Png,
Some("jpg") | Some("jpeg") => super::ContentType::Jpeg,
Some("svg") => super::ContentType::Svg,
Some("txt") | Some("md") => super::ContentType::PlainText,
_ => super::ContentType::OctetStream,
}
}
#[allow(dead_code)]
pub fn references_domi_js(body: &[u8]) -> bool {
let hay = String::from_utf8_lossy(body);
hay.contains("src=\"domi.js\"")
|| hay.contains("src='domi.js'")
|| hay.contains("src=\"./domi.js\"")
|| hay.contains("src='./domi.js'")
|| hay.contains("src=\"../scripts/domi.js\"")
|| hay.contains("src='../scripts/domi.js'")
}
pub fn ensure_no_parent_dir_components(target: &Path) -> Result<(), ServeError> {
for c in target.components() {
if let Component::ParentDir = c {
return Err(ServeError::EscapedRoot);
}
}
Ok(())
}