recreate the old directory listing
using nice tables with links to the .tar archives
This commit is contained in:
parent
375d8aa62b
commit
ed16068909
1 changed files with 35 additions and 110 deletions
|
@ -23,7 +23,7 @@ pub fn directory_listing(
|
||||||
dir: &Directory,
|
dir: &Directory,
|
||||||
req: &HttpRequest,
|
req: &HttpRequest,
|
||||||
) -> Result<ServiceResponse, std::io::Error> {
|
) -> Result<ServiceResponse, std::io::Error> {
|
||||||
let index_of = format!("Index of {}", req.path());
|
let index_of = req.path().trim_end_matches('/');
|
||||||
let mut body = String::new();
|
let mut body = String::new();
|
||||||
let base = Path::new(req.path());
|
let base = Path::new(req.path());
|
||||||
|
|
||||||
|
@ -43,16 +43,18 @@ pub fn directory_listing(
|
||||||
if metadata.is_dir() {
|
if metadata.is_dir() {
|
||||||
let _ = write!(
|
let _ = write!(
|
||||||
body,
|
body,
|
||||||
"<li><a href=\"{}\">{}/</a></li>",
|
"<tr><td>📂 <a href='{}/'>{}/</a></td> <td><small>[<a href='{}.tar'>.tar</a>]</small></td></tr>",
|
||||||
encode_file_url!(p),
|
encode_file_url!(p),
|
||||||
encode_file_name!(entry),
|
encode_file_name!(entry),
|
||||||
|
encode_file_url!(p),
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
let _ = write!(
|
let _ = write!(
|
||||||
body,
|
body,
|
||||||
"<li><a href=\"{}\">{}</a></li>",
|
"<tr><td>🗎 <a href='{}'>{}</a></td> <td>{}</td></tr>",
|
||||||
encode_file_url!(p),
|
encode_file_url!(p),
|
||||||
encode_file_name!(entry),
|
encode_file_name!(entry),
|
||||||
|
metadata.len(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -61,15 +63,37 @@ pub fn directory_listing(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let html = format!(
|
let header = format!(
|
||||||
"<html>\
|
"<h1>Index of {}/</h1>\n\
|
||||||
<head><title>{}</title></head>\
|
<small>[<a href='{}.tar'>.tar</a> of whole directory]</small>",
|
||||||
<body><h1>{}</h1>\
|
index_of, if index_of.is_empty() { "_" } else { index_of }
|
||||||
<ul>\
|
|
||||||
{}\
|
|
||||||
</ul></body>\n</html>",
|
|
||||||
index_of, index_of, body
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let footer = format!(
|
||||||
|
r#"<footer><a href="{}">{} {}</a></footer>"#,
|
||||||
|
env!("CARGO_PKG_HOMEPAGE"),
|
||||||
|
env!("CARGO_PKG_NAME"),
|
||||||
|
env!("CARGO_PKG_VERSION")
|
||||||
|
);
|
||||||
|
|
||||||
|
let style = include_str!("style.css");
|
||||||
|
|
||||||
|
let html = format!(
|
||||||
|
"<!DOCTYPE html>\n\
|
||||||
|
<html>\n\
|
||||||
|
<head>\n\
|
||||||
|
<title>Index of {}</title>\n\
|
||||||
|
<style>\n{}</style></head>\n\
|
||||||
|
<body>\n{}\n\
|
||||||
|
<table>\n\
|
||||||
|
<tr><td>📁 <a href='../'>../</a></td><td>Size</td></tr>\n\
|
||||||
|
{}\
|
||||||
|
</table>\n\
|
||||||
|
{}\
|
||||||
|
</body>\n</html>",
|
||||||
|
index_of, style, header, body, footer
|
||||||
|
);
|
||||||
|
|
||||||
Ok(ServiceResponse::new(
|
Ok(ServiceResponse::new(
|
||||||
req.clone(),
|
req.clone(),
|
||||||
HttpResponse::Ok()
|
HttpResponse::Ok()
|
||||||
|
@ -77,102 +101,3 @@ pub fn directory_listing(
|
||||||
.body(html),
|
.body(html),
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
// fn handle_directory(
|
|
||||||
// dir: &fs::Directory,
|
|
||||||
// req: &HttpRequest,
|
|
||||||
// ) -> Result<ServiceResponse, std::io::Error> {
|
|
||||||
// let rd = std::fs::read_dir(&dir.path)?;
|
|
||||||
|
|
||||||
// fn optimistic_is_dir(entry: &std::fs::DirEntry) -> bool {
|
|
||||||
// // consider it non directory if metadata reading fails, better than an unwrap() panic
|
|
||||||
// entry
|
|
||||||
// .metadata()
|
|
||||||
// .map(|m| m.file_type().is_dir())
|
|
||||||
// .unwrap_or(false)
|
|
||||||
// }
|
|
||||||
// let mut paths: Vec<_> = rd
|
|
||||||
// .filter_map(|entry| {
|
|
||||||
// if dir.is_visible(&entry) {
|
|
||||||
// entry.ok()
|
|
||||||
// } else {
|
|
||||||
// None
|
|
||||||
// }
|
|
||||||
// })
|
|
||||||
// .collect();
|
|
||||||
// paths.sort_by_key(|entry| (!optimistic_is_dir(entry), entry.file_name()));
|
|
||||||
|
|
||||||
// let tar_url = req.path().trim_end_matches('/'); // this is already encoded
|
|
||||||
|
|
||||||
// let mut body = String::new();
|
|
||||||
// writeln!(body, "<h1>Index of {}</h1>", req.path()).unwrap(); // FIXME: decode from url, escape for html
|
|
||||||
// writeln!(
|
|
||||||
// body,
|
|
||||||
// r#"<small>[<a href="{}.tar">.tar</a> of whole directory]</small>"#,
|
|
||||||
// tar_url
|
|
||||||
// )
|
|
||||||
// .unwrap();
|
|
||||||
// writeln!(body, "<table>").unwrap();
|
|
||||||
// writeln!(
|
|
||||||
// body,
|
|
||||||
// "<tr><td>📁 <a href='../'>../</a></td><td>Size</td></tr>"
|
|
||||||
// )
|
|
||||||
// .unwrap();
|
|
||||||
|
|
||||||
// for entry in paths {
|
|
||||||
// let meta = entry.metadata()?;
|
|
||||||
// let file_url =
|
|
||||||
// utf8_percent_encode(&entry.file_name().to_string_lossy(), NON_ALPHANUMERIC).to_string();
|
|
||||||
// let file_name = escape_html_entity(&entry.file_name().to_string_lossy()).to_string();
|
|
||||||
// let size = meta.len();
|
|
||||||
|
|
||||||
// write!(body, "<tr>").unwrap();
|
|
||||||
// if meta.file_type().is_dir() {
|
|
||||||
// writeln!(
|
|
||||||
// body,
|
|
||||||
// r#"<td>📂 <a href="{}/">{}/</a></td>"#,
|
|
||||||
// file_url, file_name
|
|
||||||
// )
|
|
||||||
// .unwrap();
|
|
||||||
// write!(
|
|
||||||
// body,
|
|
||||||
// r#" <td><small>[<a href="{}.tar">.tar</a>]</small></td>"#,
|
|
||||||
// file_url
|
|
||||||
// )
|
|
||||||
// .unwrap();
|
|
||||||
// } else {
|
|
||||||
// writeln!(
|
|
||||||
// body,
|
|
||||||
// r#"<td>🗎 <a href="{}">{}</a></td>"#,
|
|
||||||
// file_url, file_name
|
|
||||||
// )
|
|
||||||
// .unwrap();
|
|
||||||
// write!(body, " <td>{}</td>", size).unwrap();
|
|
||||||
// }
|
|
||||||
// writeln!(body, "</tr>").unwrap();
|
|
||||||
// }
|
|
||||||
// writeln!(body, "</table>").unwrap();
|
|
||||||
// writeln!(
|
|
||||||
// body,
|
|
||||||
// r#"<footer><a href="{}">{} {}</a></footer>"#,
|
|
||||||
// env!("CARGO_PKG_HOMEPAGE"),
|
|
||||||
// env!("CARGO_PKG_NAME"),
|
|
||||||
// env!("CARGO_PKG_VERSION")
|
|
||||||
// )
|
|
||||||
// .unwrap();
|
|
||||||
|
|
||||||
// let mut html = String::new();
|
|
||||||
// writeln!(html, "<!DOCTYPE html>").unwrap();
|
|
||||||
// writeln!(html, "<html><head>").unwrap();
|
|
||||||
// writeln!(html, "<title>Index of {}</title>", req.path()).unwrap();
|
|
||||||
// writeln!(html, "<style>\n{}</style>", include_str!("style.css")).unwrap();
|
|
||||||
// writeln!(html, "</head>").unwrap();
|
|
||||||
// writeln!(html, "<body>\n{}</body>", body).unwrap();
|
|
||||||
// writeln!(html, "</html>").unwrap();
|
|
||||||
|
|
||||||
// let resp = HttpResponse::Ok()
|
|
||||||
// .content_type("text/html; charset=utf-8")
|
|
||||||
// .body(html);
|
|
||||||
|
|
||||||
// Ok(ServiceResponse::new(req.clone(), resp))
|
|
||||||
// }
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue