From 57462b11d759a15fd430e1ed7ebc605e66f2fad6 Mon Sep 17 00:00:00 2001 From: Pinghao Wu Date: Thu, 16 Jan 2025 17:40:59 +0800 Subject: [PATCH] deref symlink for file info --- server.go | 48 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/server.go b/server.go index a85955c..25632f8 100644 --- a/server.go +++ b/server.go @@ -12,6 +12,7 @@ import ( "flag" "html/template" "io/fs" + "log/slog" "mime" "net" "net/http" @@ -169,16 +170,14 @@ var ( .. - {{range .Entries}} + {{range $name, $e := .Entries}} - {{.Name}}{{if .IsDir}}/{{end}} - {{with .Info}} - {{.ModTime | timefmt}} - {{if .IsDir}} - - - {{else}} - {{.Size | numfmt}} - {{end}} + {{$name}}{{if $e.IsDir}}/{{end}} + {{$e.ModTime | timefmt}} + {{if $e.IsDir}} + - + {{else}} + {{$e.Size | numfmt}} {{end}} {{end}} @@ -194,7 +193,7 @@ var ( type Data struct { Path string - Entries []fs.DirEntry + Entries map[string]fs.FileInfo Footer string } @@ -219,6 +218,11 @@ func main() { if !ok { panic("fs impl not supporting fs.ReadDirFS") } + sf, ok := f.(fs.StatFS) + if !ok { + panic("fs impl not supporting fs.StatFS") + } + staticHandler := http.FileServerFS(f) h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { l := len(r.URL.Path) @@ -239,7 +243,29 @@ func main() { w.WriteHeader(404) return } - tpl.Execute(w, Data{r.URL.Path, ds, *foot}) + + entries := map[string]fs.FileInfo{} + for _, d := range ds { + dname := d.Name() + fp := p + "/" + dname + if d.Type()&fs.ModeSymlink == fs.ModeSymlink { + e, err := sf.Stat(fp) + if err != nil { + slog.Warn("cannot stat symlink", "file", fp, "error", err) + } else { + entries[dname] = e + } + } else { + e, err := d.Info() + if err != nil { + slog.Warn("cannot fs.DirEntry.Info()", "file", fp, "error", err) + } else { + entries[dname] = e + } + } + } + + tpl.Execute(w, Data{r.URL.Path, entries, *foot}) } else { staticHandler.ServeHTTP(w, r) } -- 2.45.2