Skip to content

Commit cc23ad6

Browse files
authored
fileserver: Add file_limit option for browse (to be experimental) (#6648)
* Add file_limit option for file_server browse * Move file_limit inside browse. * add file_server_file_limit caddyfile adapt test.
1 parent 91e3413 commit cc23ad6

File tree

4 files changed

+62
-2
lines changed

4 files changed

+62
-2
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
:80
2+
3+
file_server {
4+
browse {
5+
file_limit 4000
6+
}
7+
}
8+
----------
9+
{
10+
"apps": {
11+
"http": {
12+
"servers": {
13+
"srv0": {
14+
"listen": [
15+
":80"
16+
],
17+
"routes": [
18+
{
19+
"handle": [
20+
{
21+
"browse": {
22+
"file_limit": 4000
23+
},
24+
"handler": "file_server",
25+
"hide": [
26+
"./Caddyfile"
27+
]
28+
}
29+
]
30+
}
31+
]
32+
}
33+
}
34+
}
35+
}
36+
}

modules/caddyhttp/fileserver/browse.go

+12-1
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,15 @@ type Browse struct {
6666
// - `sort size` will sort by size in ascending order
6767
// The first option must be `sort_by` and the second option must be `order` (if exists).
6868
SortOptions []string `json:"sort,omitempty"`
69+
70+
// FileLimit limits the number of up to n DirEntry values in directory order.
71+
FileLimit int `json:"file_limit,omitempty"`
6972
}
7073

74+
const (
75+
defaultDirEntryLimit = 10000
76+
)
77+
7178
func (fsrv *FileServer) serveBrowse(fileSystem fs.FS, root, dirPath string, w http.ResponseWriter, r *http.Request, next caddyhttp.Handler) error {
7279
if c := fsrv.logger.Check(zapcore.DebugLevel, "browse enabled; listing directory contents"); c != nil {
7380
c.Write(zap.String("path", dirPath), zap.String("root", root))
@@ -206,7 +213,11 @@ func (fsrv *FileServer) serveBrowse(fileSystem fs.FS, root, dirPath string, w ht
206213
}
207214

208215
func (fsrv *FileServer) loadDirectoryContents(ctx context.Context, fileSystem fs.FS, dir fs.ReadDirFile, root, urlPath string, repl *caddy.Replacer) (*browseTemplateContext, error) {
209-
files, err := dir.ReadDir(10000) // TODO: this limit should probably be configurable
216+
dirLimit := defaultDirEntryLimit
217+
if fsrv.Browse.FileLimit != 0 {
218+
dirLimit = fsrv.Browse.FileLimit
219+
}
220+
files, err := dir.ReadDir(dirLimit)
210221
if err != nil && err != io.EOF {
211222
return nil, err
212223
}

modules/caddyhttp/fileserver/caddyfile.go

+11
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package fileserver
1616

1717
import (
1818
"path/filepath"
19+
"strconv"
1920
"strings"
2021

2122
"github.com/caddyserver/caddy/v2"
@@ -129,6 +130,16 @@ func (fsrv *FileServer) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
129130
return d.Errf("unknown sort option '%s'", dVal)
130131
}
131132
}
133+
case "file_limit":
134+
fileLimit := d.RemainingArgs()
135+
if len(fileLimit) != 1 {
136+
return d.Err("file_limit should have an integer value")
137+
}
138+
val, _ := strconv.Atoi(fileLimit[0])
139+
if fsrv.Browse.FileLimit != 0 {
140+
return d.Err("file_limit is already enabled")
141+
}
142+
fsrv.Browse.FileLimit = val
132143
default:
133144
return d.Errf("unknown subdirective '%s'", d.Val())
134145
}

modules/caddyhttp/fileserver/command.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ respond with a file listing.`,
6666
cmd.Flags().BoolP("templates", "t", false, "Enable template rendering")
6767
cmd.Flags().BoolP("access-log", "a", false, "Enable the access log")
6868
cmd.Flags().BoolP("debug", "v", false, "Enable verbose debug logs")
69+
cmd.Flags().IntP("file-limit", "f", defaultDirEntryLimit, "Max directories to read")
6970
cmd.Flags().BoolP("no-compress", "", false, "Disable Zstandard and Gzip compression")
7071
cmd.Flags().StringSliceP("precompressed", "p", []string{}, "Specify precompression file extensions. Compression preference implied from flag order.")
7172
cmd.RunE = caddycmd.WrapCommandFuncForCobra(cmdFileServer)
@@ -91,6 +92,7 @@ func cmdFileServer(fs caddycmd.Flags) (int, error) {
9192
browse := fs.Bool("browse")
9293
templates := fs.Bool("templates")
9394
accessLog := fs.Bool("access-log")
95+
fileLimit := fs.Int("file-limit")
9496
debug := fs.Bool("debug")
9597
revealSymlinks := fs.Bool("reveal-symlinks")
9698
compress := !fs.Bool("no-compress")
@@ -151,7 +153,7 @@ func cmdFileServer(fs caddycmd.Flags) (int, error) {
151153
}
152154

153155
if browse {
154-
handler.Browse = &Browse{RevealSymlinks: revealSymlinks}
156+
handler.Browse = &Browse{RevealSymlinks: revealSymlinks, FileLimit: fileLimit}
155157
}
156158

157159
handlers = append(handlers, caddyconfig.JSONModuleObject(handler, "handler", "file_server", nil))

0 commit comments

Comments
 (0)