diff --git a/modules/caddyhttp/fileserver/browse.go b/modules/caddyhttp/fileserver/browse.go
index 7cb6e407..29f29fc8 100644
--- a/modules/caddyhttp/fileserver/browse.go
+++ b/modules/caddyhttp/fileserver/browse.go
@@ -93,7 +93,7 @@ func (fsrv *FileServer) serveBrowse(root, dirPath string, w http.ResponseWriter,
return caddyhttp.Error(http.StatusInternalServerError, err)
}
- fsrv.browseApplyQueryParams(w, r, &listing)
+ fsrv.browseApplyQueryParams(w, r, listing)
buf := bufPool.Get().(*bytes.Buffer)
buf.Reset()
@@ -137,10 +137,10 @@ func (fsrv *FileServer) serveBrowse(root, dirPath string, w http.ResponseWriter,
return nil
}
-func (fsrv *FileServer) loadDirectoryContents(ctx context.Context, dir fs.ReadDirFile, root, urlPath string, repl *caddy.Replacer) (browseTemplateContext, error) {
+func (fsrv *FileServer) loadDirectoryContents(ctx context.Context, dir fs.ReadDirFile, root, urlPath string, repl *caddy.Replacer) (*browseTemplateContext, error) {
files, err := dir.ReadDir(10000) // TODO: this limit should probably be configurable
if err != nil && err != io.EOF {
- return browseTemplateContext{}, err
+ return nil, err
}
// user can presumably browse "up" to parent folder if path is longer than "/"
@@ -237,7 +237,7 @@ func isSymlink(f fs.FileInfo) bool {
// features.
type templateContext struct {
templates.TemplateContext
- browseTemplateContext
+ *browseTemplateContext
}
// bufPool is used to increase the efficiency of file listings.
diff --git a/modules/caddyhttp/fileserver/browse.html b/modules/caddyhttp/fileserver/browse.html
index a9e7272c..77de75c3 100644
--- a/modules/caddyhttp/fileserver/browse.html
+++ b/modules/caddyhttp/fileserver/browse.html
@@ -4,9 +4,26 @@
- {{- else if .HasExt ".jpg" ".jpeg" ".png" ".gif" ".webp"}}
-
- {{- else if .HasExt ".mp4" ".mov" ".mpeg" ".avi" ".ogg" ".webm"}}
+ {{- else if or (eq .Name "LICENSE") (eq .Name "README")}}
+
+ {{- else if .HasExt ".jpg" ".jpeg" ".png" ".gif" ".webp" ".tiff" ".bmp" ".heif" ".heic"}}
+ {{- if eq .Tpl.Layout "grid"}}
+
+ {{- else}}
+
+ {{- end}}
+ {{- else if .HasExt ".mp4" ".mov" ".mpeg" ".mpg" ".avi" ".ogg" ".webm" ".mkv" ".vob" ".gifv" ".3gp"}}
- {{- else if .HasExt ".mp3" ".flac" ".wav" ".wma"}}
+ {{- else if .HasExt ".mp3" ".m4a" ".aac" ".ogg" ".flac" ".wav" ".wma" ".midi" ".cda"}}
- {{- else if .HasExt ".txt"}}
+ {{- else if .HasExt ".txt" ".doc" ".docx" ".odt" ".fodt" ".rtf"}}
- {{- else if .HasExt ".zip" ".gz" ".xz" ".tar"}}
+ {{- else if .HasExt ".xls" ".xlsx" ".ods" ".fods"}}
+
+ {{- else if .HasExt ".ppt" ".pptx" ".odp" ".fodp"}}
+
+ {{- else if .HasExt ".zip" ".gz" ".xz" ".tar" ".7z" ".rar" ".xz" ".zst"}}
+ {{- else if .HasExt ".deb" ".dpkg"}}
+
+ {{- else if .HasExt ".rpm" ".exe" ".flatpak" ".appimage" ".jar" ".msi" ".apk"}}
+
+ {{- else if .HasExt ".ps1"}}
+
+ {{- else if .HasExt ".py" ".pyc" ".pyo"}}
+
+ {{- else if .HasExt ".bash" ".sh" ".com" ".bat" ".dll" ".so"}}
+
+ {{- else if .HasExt ".dmg"}}
+
+ {{- else if .HasExt ".iso" ".img"}}
+
{{- else if .HasExt ".md" ".mdown" ".markdown"}}
+ {{- else if .HasExt ".ttf" ".otf" ".woff" ".woff2" ".eof"}}
+
{{- else if .HasExt ".go"}}
+ {{- else if .HasExt ".html" ".htm"}}
+
+ {{- else if .HasExt ".js"}}
+
+ {{- else if .HasExt ".json" ".json5" ".jsonc"}}
+
+ {{- else if .HasExt ".sql"}}
+
+ {{- else if .HasExt ".db" ".sqlite" ".bak" ".mdb"}}
+
+ {{- else if .HasExt ".eml" ".email" ".mailbox" ".mbox" ".msg"}}
+
+ {{- else if .HasExt ".crt" ".pem" ".x509" ".cer" ".ca-bundle"}}
+
+ {{- else if .HasExt ".key" ".keystore" ".jks" ".p12" ".pfx" ".pub"}}
+
{{- else}}
{{- if .IsSymlink}}