use iron::Request;
use std::path::{PathBuf, AsPath};
use std::fs::PathExt;
pub struct RequestedPath {
pub path: PathBuf,
}
impl RequestedPath {
pub fn new<P: AsPath>(root_path: P, request: &Request) -> RequestedPath {
let mut path = root_path.as_path().to_path_buf();
path.extend(&request.url.path);
RequestedPath { path: path }
}
pub fn should_redirect(&self, request: &Request) -> bool {
let last_url_element = request.url.path
.as_slice()
.last()
.map(|s| s.as_slice());
let has_trailing_slash = match last_url_element {
Some("") => true,
_ => false,
};
self.path.is_dir() && !has_trailing_slash
}
pub fn get_file(self) -> Option<PathBuf> {
if self.path.is_file() {
return Some(self.path);
}
let index_path = self.path.join("index.html");
if index_path.is_file() {
Some(index_path)
} else {
None
}
}
}