refactor: improve auto index options
Diff
src/directory_listing.rs | 43 ++++++++++++++++++++++++++++---------------
src/static_files.rs | 21 ++++++++++++---------
2 files changed, 40 insertions(+), 24 deletions(-)
@@ -33,36 +33,49 @@ pub enum DirListFmt {
Json,
}
pub struct DirListOpts<'a> {
pub method: &'a Method,
pub current_path: &'a str,
pub uri_query: Option<&'a str>,
pub filepath: &'a Path,
pub dir_listing_order: u8,
pub dir_listing_format: &'a DirListFmt,
pub ignore_hidden_files: bool,
}
pub fn auto_index<'a>(
method: &'a Method,
current_path: &'a str,
uri_query: Option<&'a str>,
filepath: &'a Path,
dir_listing_order: u8,
dir_listing_format: &'a DirListFmt,
ignore_hidden_files: bool,
) -> impl Future<Output = Result<Response<Body>, StatusCode>> + Send + 'a {
pub fn auto_index(
opts: DirListOpts<'_>,
) -> impl Future<Output = Result<Response<Body>, StatusCode>> + Send + '_ {
let filepath = opts.filepath;
let parent = filepath.parent().unwrap_or(filepath);
tokio::fs::read_dir(parent).then(move |res| match res {
Ok(dir_reader) => Either::Left(async move {
let is_head = method.is_head();
let is_head = opts.method.is_head();
match read_dir_entries(
dir_reader,
current_path,
uri_query,
opts.current_path,
opts.uri_query,
is_head,
dir_listing_order,
dir_listing_format,
ignore_hidden_files,
opts.dir_listing_order,
opts.dir_listing_format,
opts.ignore_hidden_files,
)
.await
{
@@ -34,7 +34,10 @@ use crate::exts::path::PathExt;
use crate::Result;
#[cfg(feature = "directory-listing")]
use crate::{directory_listing, directory_listing::DirListFmt};
use crate::{
directory_listing,
directory_listing::{DirListFmt, DirListOpts},
};
pub struct HandleOpts<'a> {
@@ -136,15 +139,15 @@ pub async fn handle<'a>(opts: &HandleOpts<'a>) -> Result<(Response<Body>, bool),
#[cfg(feature = "directory-listing")]
if opts.dir_listing && !file_path.exists() {
let resp = directory_listing::auto_index(
let resp = directory_listing::auto_index(DirListOpts {
method,
uri_path,
opts.uri_query,
file_path,
opts.dir_listing_order,
opts.dir_listing_format,
opts.ignore_hidden_files,
)
current_path: uri_path,
uri_query: opts.uri_query,
filepath: file_path,
dir_listing_order: opts.dir_listing_order,
dir_listing_format: opts.dir_listing_format,
ignore_hidden_files: opts.ignore_hidden_files,
})
.await?;
return Ok((resp, is_precompressed));