implement custom directory listing
This commit is contained in:
parent
27eec3f434
commit
b5533e1428
1 changed files with 37 additions and 6 deletions
43
src/main.rs
43
src/main.rs
|
@ -1,17 +1,20 @@
|
|||
extern crate actix_web;
|
||||
extern crate actix;
|
||||
extern crate bytes;
|
||||
extern crate futures;
|
||||
extern crate tar;
|
||||
extern crate htmlescape;
|
||||
extern crate percent_encoding;
|
||||
|
||||
use actix_web::{server, error, fs, App, HttpRequest, HttpResponse, Error, Result, http::Method, http::StatusCode};
|
||||
use actix_web::{server, error, fs, App, HttpRequest, HttpResponse, Error, Result, http::Method};
|
||||
use futures::Stream;
|
||||
|
||||
use std::env;
|
||||
use std::io;
|
||||
use std::path::PathBuf;
|
||||
|
||||
|
||||
// TODO cli args
|
||||
fn main() -> Result<(), Error> {
|
||||
let bind_addr = env::var("HTTP_ADDR").unwrap_or("127.0.0.1:8088".to_string());
|
||||
let bind_addr = env::var("HTTP_ADDR").unwrap_or(String::from("0.0.0.0:8000"));
|
||||
let sys = actix::System::new("static_index");
|
||||
|
||||
server::new(|| {
|
||||
|
@ -29,11 +32,39 @@ fn main() -> Result<(), Error> {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
use percent_encoding::{utf8_percent_encode, DEFAULT_ENCODE_SET};
|
||||
use htmlescape::encode_minimal as escape_html_entity;
|
||||
|
||||
fn handle_directory<'a, 'b>(
|
||||
dir: &'a fs::Directory,
|
||||
req: &'b HttpRequest,
|
||||
) -> io::Result<HttpResponse> {
|
||||
Ok(HttpResponse::with_body(StatusCode::OK, "directory index here"))
|
||||
) -> std::io::Result<HttpResponse> {
|
||||
let mut s = String::from(format!("<html>
|
||||
<head><title>Index of {index}</title></head>
|
||||
<body bgcolor='white'>
|
||||
<h1>Index of {index}</h1>
|
||||
<hr><a href='../'>../</a>
|
||||
<table>\n", index=req.path()));
|
||||
let mut paths: Vec<_> = std::fs::read_dir(&dir.path).unwrap()
|
||||
.filter(|r| dir.is_visible(r))
|
||||
.filter_map(|r| r.ok())
|
||||
.collect();
|
||||
paths.sort_by_key(|dir| dir.metadata().unwrap().file_type().is_dir());
|
||||
for entry in paths {
|
||||
let meta = entry.metadata()?;
|
||||
let file_url = utf8_percent_encode(&entry.file_name().to_string_lossy(), DEFAULT_ENCODE_SET).to_string();
|
||||
// " -- " & -- & ' -- ' < -- < > -- >
|
||||
let file_name = escape_html_entity(&entry.file_name().to_string_lossy());
|
||||
|
||||
let size = meta.len();
|
||||
if meta.file_type().is_dir() {
|
||||
s.push_str(&format!("<tr><td><a href='{file_url}/'>{file_name}/</a> <small><a href='{file_url}.tar'>(tar)</a></small></td></tr>\n", file_name=file_name, file_url=file_url));
|
||||
} else {
|
||||
s.push_str(&format!("<tr><td><a href='{file_url}'>{file_name}</a> (size: {size})</td></tr>\n", file_name=file_name, file_url=file_url, size=size));
|
||||
}
|
||||
}
|
||||
s.push_str("</table><hr></body></html>");
|
||||
Ok(HttpResponse::Ok().content_type("text/html").body(s))
|
||||
}
|
||||
|
||||
fn handle_tar(req: &HttpRequest) -> Result<HttpResponse> {
|
||||
|
|
Loading…
Add table
Reference in a new issue