mirror of
https://github.com/YGGverse/agate.git
synced 2026-04-09 04:55:27 +00:00
Facter directory listing into a function
This commit is contained in:
parent
e4dacd1315
commit
a007908248
1 changed files with 30 additions and 31 deletions
61
src/main.rs
61
src/main.rs
|
|
@ -188,33 +188,9 @@ async fn send_response<W: Write + Unpin>(url: Url, stream: &mut W) -> Result {
|
||||||
// if the path ends with a slash or the path is empty, the links will work the same
|
// if the path ends with a slash or the path is empty, the links will work the same
|
||||||
// without a redirect
|
// without a redirect
|
||||||
path.push("index.gmi");
|
path.push("index.gmi");
|
||||||
if path.exists() {
|
if !path.exists() && path.with_file_name(".directory-listing-ok").exists() {
|
||||||
// index file exists
|
|
||||||
} else if path.with_file_name(".directory-listing-ok").exists() {
|
|
||||||
// no index file, but directory listing allowed
|
|
||||||
path.pop();
|
path.pop();
|
||||||
log::info!("Listing directory {:?}", path);
|
return list_directory(stream, &path).await;
|
||||||
let entries = std::fs::read_dir(path)?;
|
|
||||||
let listing = entries
|
|
||||||
.filter(Result::is_ok)
|
|
||||||
.map(Result::unwrap)
|
|
||||||
.map(|entry| {
|
|
||||||
// transform filenames into gemini link lines
|
|
||||||
let mut name = String::from("=> ");
|
|
||||||
name += &entry.file_name().to_string_lossy();
|
|
||||||
if entry.path().is_dir() {
|
|
||||||
// to avoid redirects link to directories with a trailing slash
|
|
||||||
name += "/";
|
|
||||||
}
|
|
||||||
name + "\n"
|
|
||||||
})
|
|
||||||
// filter out files starting with a dot
|
|
||||||
.filter(|entry| !entry.starts_with("=> ."))
|
|
||||||
.collect::<String>();
|
|
||||||
|
|
||||||
respond(stream, "20", &["text/gemini"]).await?;
|
|
||||||
stream.write_all(listing.as_bytes()).await?;
|
|
||||||
return Ok(());
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// if client is not redirected, links may not work as expected without trailing slash
|
// if client is not redirected, links may not work as expected without trailing slash
|
||||||
|
|
@ -227,11 +203,7 @@ async fn send_response<W: Write + Unpin>(url: Url, stream: &mut W) -> Result {
|
||||||
|
|
||||||
// Send header.
|
// Send header.
|
||||||
if path.extension() == Some(OsStr::new("gmi")) {
|
if path.extension() == Some(OsStr::new("gmi")) {
|
||||||
if let Some(lang) = ARGS.language.as_deref() {
|
send_text_gemini_header(stream).await?;
|
||||||
respond(stream, "20", &["text/gemini;lang=", lang]).await?;
|
|
||||||
} else {
|
|
||||||
respond(stream, "20", &["text/gemini"]).await?;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
let mime = mime_guess::from_path(&path).first_or_octet_stream();
|
let mime = mime_guess::from_path(&path).first_or_octet_stream();
|
||||||
respond(stream, "20", &[mime.essence_str()]).await?;
|
respond(stream, "20", &[mime.essence_str()]).await?;
|
||||||
|
|
@ -252,3 +224,30 @@ async fn respond<W: Write + Unpin>(stream: &mut W, status: &str, meta: &[&str])
|
||||||
stream.write_all(b"\r\n").await?;
|
stream.write_all(b"\r\n").await?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn list_directory<W: Write + Unpin>(stream: &mut W, path: &Path) -> Result {
|
||||||
|
log::info!("Listing directory {:?}", path);
|
||||||
|
send_text_gemini_header(stream).await?;
|
||||||
|
for entry in std::fs::read_dir(path)? {
|
||||||
|
let entry = entry?;
|
||||||
|
let mut name = entry.file_name().into_string().or(Err("Non-Unicode filename"))?;
|
||||||
|
if name.starts_with('.') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if entry.file_type()?.is_dir() {
|
||||||
|
name += "/";
|
||||||
|
}
|
||||||
|
stream.write_all(b"=> ").await?;
|
||||||
|
stream.write_all(name.as_bytes()).await?;
|
||||||
|
stream.write_all(b"\n").await?;
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn send_text_gemini_header<W: Write + Unpin>(stream: &mut W) -> Result {
|
||||||
|
if let Some(lang) = ARGS.language.as_deref() {
|
||||||
|
respond(stream, "20", &["text/gemini;lang=", lang]).await
|
||||||
|
} else {
|
||||||
|
respond(stream, "20", &["text/gemini"]).await
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue