index : static-web-server.git

ascending towards madness

author Jose Quintana <joseluisquintana20@gmail.com> 2022-10-14 13:43:30.0 +00:00:00
committer Jose Quintana <joseluisquintana20@gmail.com> 2022-10-14 13:43:30.0 +00:00:00
commit
abef7857798a8a6bfc394b07e8bbbd61ebc4ace2 [patch]
tree
87231f2fe4f5c98d56c18e1c989eeaa28aa112d1
parent
4d46813daa025b8e251d3e40cdab7719e05ab2d7
download
abef7857798a8a6bfc394b07e8bbbd61ebc4ace2.tar.gz

fix: directory listing json syntax error when empty root folder

refs: #151

Diff

 .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<String> 
        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<usize>,
        }

        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<FileEntry> = 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);
                }
            }
        }
    }
}