aboutsummaryrefslogtreecommitdiffstats
path: root/src/listing.rs
diff options
context:
space:
mode:
authorAli MJ Al-Nasrawy <alimjalnasrawy@gmail.com>2021-04-05 20:21:34 +0000
committerAli MJ Al-Nasrawy <alimjalnasrawy@gmail.com>2021-04-05 20:21:34 +0000
commit60695fac0957a4032ee84057de676ab8e3ddbb5d (patch)
treecdb58654c44c6c15ad8dcb2cfadc8e7b39d09047 /src/listing.rs
parentHonor --no-symlinks option when listing (diff)
downloadminiserve-60695fac0957a4032ee84057de676ab8e3ddbb5d.tar.gz
miniserve-60695fac0957a4032ee84057de676ab8e3ddbb5d.zip
Avoid unneccessary syscalls for entry metadata
For non-symlink files and directories, there is no need to call `std::fs::metadata()` as the metadata are already obtained via `entry.metadata()`
Diffstat (limited to 'src/listing.rs')
-rw-r--r--src/listing.rs11
1 files changed, 7 insertions, 4 deletions
diff --git a/src/listing.rs b/src/listing.rs
index 53d7233..9d74906 100644
--- a/src/listing.rs
+++ b/src/listing.rs
@@ -255,13 +255,16 @@ pub fn directory_listing(
// show file url as relative to static path
let file_url = utf8_percent_encode(&p.to_string_lossy(), FRAGMENT).to_string();
let file_name = entry.file_name().to_string_lossy().to_string();
- let is_symlink = match entry.metadata() {
- Ok(metadata) => metadata.file_type().is_symlink(),
- Err(_) => continue,
+ let (is_symlink, metadata) = match entry.metadata() {
+ Ok(metadata) if metadata.file_type().is_symlink() => {
+ // for symlinks, get the metadata of the original file
+ (true, std::fs::metadata(entry.path()))
+ }
+ res => (false, res),
};
// if file is a directory, add '/' to the end of the name
- if let Ok(metadata) = std::fs::metadata(entry.path()) {
+ if let Ok(metadata) = metadata {
if skip_symlinks && is_symlink {
continue;
}