From abef7857798a8a6bfc394b07e8bbbd61ebc4ace2 Mon Sep 17 00:00:00 2001 From: Jose Quintana Date: Fri, 14 Oct 2022 15:43:30 +0200 Subject: [PATCH] fix: directory listing json syntax error when empty root folder refs: #151 --- .gitignore | 1 + src/directory_listing.rs | 6 +++++- tests/dir_listing.rs | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index c8150a9..b8d036a 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ **/*.zst **/*.out* **/*.perf* +**/*empty* release .vscode TODO diff --git a/src/directory_listing.rs b/src/directory_listing.rs index c9ab5bb..5953b98 100644 --- a/src/directory_listing.rs +++ b/src/directory_listing.rs @@ -294,7 +294,11 @@ fn json_auto_index(entries: &mut [FileEntry], order_code: u8) -> Result json.push_str("},"); } - json.pop(); + // Strip trailing comma out in case of available items + if json.len() > 1 { + json.pop(); + } + json.push(']'); Ok(json) diff --git a/tests/dir_listing.rs b/tests/dir_listing.rs index a27fd33..ed3c94e 100644 --- a/tests/dir_listing.rs +++ b/tests/dir_listing.rs @@ -271,4 +271,60 @@ mod tests { } } } + + #[tokio::test] + async fn dir_listing_json_format_empty() { + #[derive(Serialize, Deserialize)] + struct FileEntry { + name: String, + #[serde(rename = "type")] + typed: String, + mtime: String, + size: Option, + } + + let empty_dir = PathBuf::from("tests/fixtures/empty"); + if empty_dir.exists() { + std::fs::remove_dir(&empty_dir).unwrap(); + } + std::fs::create_dir(&empty_dir).unwrap(); + + for method in METHODS { + match static_files::handle(&HandleOpts { + method: &method, + headers: &HeaderMap::new(), + base_path: &root_dir(&empty_dir), + uri_path: "/", + uri_query: None, + dir_listing: true, + dir_listing_order: 1, + dir_listing_format: &DirListFmt::Json, + redirect_trailing_slash: true, + compression_static: false, + }) + .await + { + Ok((mut res, _)) => { + assert_eq!(res.status(), 200); + assert_eq!(res.headers()["content-type"], "application/json"); + + let body = hyper::body::to_bytes(res.body_mut()) + .await + .expect("unexpected bytes error during `body` conversion"); + let body_str = std::str::from_utf8(&body).unwrap(); + + if method == Method::GET { + let entries: Vec = serde_json::from_str(body_str).unwrap(); + assert!(entries.is_empty()) + } else { + assert!(body_str.is_empty()); + } + } + Err(status) => { + assert!(method != Method::GET && method != Method::HEAD); + assert_eq!(status, StatusCode::METHOD_NOT_ALLOWED); + } + } + } + } } -- libgit2 1.7.2