diff options
author | metamuffin <metamuffin@disroot.org> | 2023-11-20 13:23:52 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2023-11-20 13:23:52 +0100 |
commit | 1f218b074c98cb6b8e48e34f92b6bf2623a72eca (patch) | |
tree | 63a93301ab448f2305eeb7f0bc17b117526699ad | |
parent | bcc135761db881fd937767788a0d0480bb1b1f31 (diff) | |
download | gnix-1f218b074c98cb6b8e48e34f92b6bf2623a72eca.tar gnix-1f218b074c98cb6b8e48e34f92b6bf2623a72eca.tar.bz2 gnix-1f218b074c98cb6b8e48e34f92b6bf2623a72eca.tar.zst |
fix index.html not being sent if index=false
-rw-r--r-- | src/files.rs | 67 |
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! { |