summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2023-11-20 13:23:52 +0100
committermetamuffin <metamuffin@disroot.org>2023-11-20 13:23:52 +0100
commit1f218b074c98cb6b8e48e34f92b6bf2623a72eca (patch)
tree63a93301ab448f2305eeb7f0bc17b117526699ad
parentbcc135761db881fd937767788a0d0480bb1b1f31 (diff)
downloadgnix-1f218b074c98cb6b8e48e34f92b6bf2623a72eca.tar
gnix-1f218b074c98cb6b8e48e34f92b6bf2623a72eca.tar.bz2
gnix-1f218b074c98cb6b8e48e34f92b6bf2623a72eca.tar.zst
fix index.html not being sent if index=false
-rw-r--r--src/files.rs67
1 files changed, 36 insertions, 31 deletions
diff --git a/src/files.rs b/src/files.rs
index cf53942..733d045 100644
--- a/src/files.rs
+++ b/src/files.rs
@@ -53,27 +53,29 @@ pub async fn serve_files(
let metadata = path.metadata()?;
if metadata.file_type().is_dir() {
- if !config.index {
- return Err(ServiceError::NotFound);
- }
debug!("sending index for {path:?}");
-
- if !rpath.ends_with("/") {
- let mut r = Response::new(String::new());
- *r.status_mut() = StatusCode::FOUND;
- r.headers_mut().insert(
- LOCATION,
- HeaderValue::from_str(&format!("{}/", rpath)).map_err(|_| ServiceError::Other)?,
- );
- return Ok(r.map(|b| b.map_err(|e| match e {}).boxed()));
+ if let Ok(indexhtml) = read_to_string(path.join("index.html")).await {
+ return Ok(html_string_response(indexhtml));
}
- return index(&path, rpath.to_string()).await.map(|s| {
- let mut r = Response::new(s);
- r.headers_mut()
- .insert(CONTENT_TYPE, HeaderValue::from_static("text/html"));
- r.map(|b| b.map_err(|e| match e {}).boxed())
- });
+ if config.index {
+ if !rpath.ends_with("/") {
+ let mut r = Response::new(String::new());
+ *r.status_mut() = StatusCode::FOUND;
+ r.headers_mut().insert(
+ LOCATION,
+ HeaderValue::from_str(&format!("{}/", rpath))
+ .map_err(|_| ServiceError::Other)?,
+ );
+ return Ok(r.map(|b| b.map_err(|e| match e {}).boxed()));
+ }
+
+ return index(&path, rpath.to_string())
+ .await
+ .map(html_string_response);
+ } else {
+ return Err(ServiceError::NotFound);
+ }
}
let range = req.headers().typed_get::<headers::Range>();
@@ -216,20 +218,23 @@ async fn index(path: &Path, rpath: String) -> Result<String, ServiceError> {
.map(|e| e.and_then(|e| Ok((e.file_name().into_string().unwrap(), e.metadata()?))))
.filter(|e| e.as_ref().map(|(e, _)| !e.starts_with(".")).unwrap_or(true))
.collect::<Result<Vec<_>, _>>()?;
- if let Ok(indexhtml) = read_to_string(path.join("index.html")).await {
- Ok(indexhtml)
- } else {
- let banner = read_to_string(path.join("index.banner.html")).await.ok();
- let mut s = String::new();
- IndexTemplate {
- files,
- banner,
- path: rpath,
- }
- .render(&mut s)
- .unwrap();
- Ok(s)
+ let banner = read_to_string(path.join("index.banner.html")).await.ok();
+ let mut s = String::new();
+ IndexTemplate {
+ files,
+ banner,
+ path: rpath,
}
+ .render(&mut s)
+ .unwrap();
+ Ok(s)
+}
+
+fn html_string_response(s: String) -> hyper::Response<BoxBody<Bytes, ServiceError>> {
+ let mut r = Response::new(s);
+ r.headers_mut()
+ .insert(CONTENT_TYPE, HeaderValue::from_static("text/html"));
+ r.map(|b| b.map_err(|e| match e {}).boxed())
}
markup::define! {