summaryrefslogtreecommitdiff
path: root/modules/caddyhttp/fileserver/browsetplcontext.go
diff options
context:
space:
mode:
authorMatt Holt <mholt@users.noreply.github.com>2022-07-30 13:07:44 -0600
committerGitHub <noreply@github.com>2022-07-30 13:07:44 -0600
commit6668271661857b2cc43143ff65edf1071013e67e (patch)
tree347a2b46e9c36c4af0f68a660821546c25e6441a /modules/caddyhttp/fileserver/browsetplcontext.go
parent07ed3e7c3078723b55687bf4b262d24ef1645c7d (diff)
fileserver: Support virtual file systems (#4909)
* fileserver: Support virtual file systems (close #3720) This change replaces the hard-coded use of os.Open() and os.Stat() with the use of the new (Go 1.16) io/fs APIs, enabling virtual file systems. It introduces a new module namespace, caddy.fs, for such file systems. Also improve documentation for the file server. I realized it was one of the first modules written for Caddy 2, and the docs hadn't really been updated since! * Virtualize FS for file matcher; minor tweaks * Fix tests and rename dirFS -> osFS (Since we do not use a root directory, it is dynamic.)
Diffstat (limited to 'modules/caddyhttp/fileserver/browsetplcontext.go')
-rw-r--r--modules/caddyhttp/fileserver/browsetplcontext.go30
1 files changed, 20 insertions, 10 deletions
diff --git a/modules/caddyhttp/fileserver/browsetplcontext.go b/modules/caddyhttp/fileserver/browsetplcontext.go
index 87156d4..49788ee 100644
--- a/modules/caddyhttp/fileserver/browsetplcontext.go
+++ b/modules/caddyhttp/fileserver/browsetplcontext.go
@@ -15,6 +15,7 @@
package fileserver
import (
+ "io/fs"
"net/url"
"os"
"path"
@@ -26,22 +27,31 @@ import (
"github.com/caddyserver/caddy/v2"
"github.com/caddyserver/caddy/v2/modules/caddyhttp"
"github.com/dustin/go-humanize"
+ "go.uber.org/zap"
)
-func (fsrv *FileServer) directoryListing(files []os.FileInfo, canGoUp bool, root, urlPath string, repl *caddy.Replacer) browseTemplateContext {
+func (fsrv *FileServer) directoryListing(entries []fs.DirEntry, canGoUp bool, root, urlPath string, repl *caddy.Replacer) browseTemplateContext {
filesToHide := fsrv.transformHidePaths(repl)
var dirCount, fileCount int
fileInfos := []fileInfo{}
- for _, f := range files {
- name := f.Name()
+ for _, entry := range entries {
+ name := entry.Name()
if fileHidden(name, filesToHide) {
continue
}
- isDir := f.IsDir() || isSymlinkTargetDir(f, root, urlPath)
+ info, err := entry.Info()
+ if err != nil {
+ fsrv.logger.Error("could not get info about directory entry",
+ zap.String("name", entry.Name()),
+ zap.String("root", root))
+ continue
+ }
+
+ isDir := entry.IsDir() || fsrv.isSymlinkTargetDir(info, root, urlPath)
// add the slash after the escape of path to avoid escaping the slash as well
if isDir {
@@ -51,11 +61,11 @@ func (fsrv *FileServer) directoryListing(files []os.FileInfo, canGoUp bool, root
fileCount++
}
- size := f.Size()
- fileIsSymlink := isSymlink(f)
+ size := info.Size()
+ fileIsSymlink := isSymlink(info)
if fileIsSymlink {
- path := caddyhttp.SanitizedPathJoin(root, path.Join(urlPath, f.Name()))
- fileInfo, err := os.Stat(path)
+ path := caddyhttp.SanitizedPathJoin(root, path.Join(urlPath, info.Name()))
+ fileInfo, err := fsrv.fileSystem.Stat(path)
if err == nil {
size = fileInfo.Size()
}
@@ -73,8 +83,8 @@ func (fsrv *FileServer) directoryListing(files []os.FileInfo, canGoUp bool, root
Name: name,
Size: size,
URL: u.String(),
- ModTime: f.ModTime().UTC(),
- Mode: f.Mode(),
+ ModTime: info.ModTime().UTC(),
+ Mode: info.Mode(),
})
}
name, _ := url.PathUnescape(urlPath)