@marcel91200 / caddy Mirror · read-only / commits / 5c47c2f1
Fork 0

Fast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS

Mirrored from https://github.com/Slazee/caddy.git

Synced Nov 12, 08:15 UTC

fileserver: browse: Configurable default sort (#6502)

* fileserver: add `sort` options * fix: test * fileserver: check options in `Provison` * fileserver: more obvious err alerts in sort options * fileserver: move `sort` to `browse` --------- Co-authored-by: Matt Holt <mholt@users.noreply.github.com>

lollipopkit🏳️‍⚧️ committed Aug 30, 2024 at 23:01 UTC 5c47c2f147e5bef44fc8cb48a655d31f5a2a817c
4 files changed +46 -41
caddytest/integration/caddyfile_adapt/file_server_sort.caddyfiletest
+10 -7
@@ -1,7 +1,9 @@
1 :80
2
3 -file_server browse {
4 - sort size desc
3 +file_server {
4 + browse {
5 + sort size desc
6 + }
7 }
8 ----------
9 {
@@ -16,14 +18,15 @@ file_server browse {
18 {
19 "handle": [
20 {
19 - "browse": {},
21 + "browse": {
22 + "sort": [
23 + "size",
24 + "desc"
25 + ]
26 + },
27 "handler": "file_server",
28 "hide": [
29 "./Caddyfile"
23 - ],
24 - "sort": [
25 - "size",
26 - "desc"
30 ]
31 }
32 ]
modules/caddyhttp/fileserver/browse.go
+12 -1
@@ -52,8 +52,19 @@ var BrowseTemplate string
52 type Browse struct {
53 // Filename of the template to use instead of the embedded browse template.
54 TemplateFile string `json:"template_file,omitempty"`
55 +
56 // Determines whether or not targets of symlinks should be revealed.
57 RevealSymlinks bool `json:"reveal_symlinks,omitempty"`
58 +
59 + // Override the default sort.
60 + // It includes the following options:
61 + // - sort_by: name(default), namedirfirst, size, time
62 + // - order: asc(default), desc
63 + // eg.:
64 + // - `sort time desc` will sort by time in descending order
65 + // - `sort size` will sort by size in ascending order
66 + // The first option must be `sort_by` and the second option must be `order` (if exists).
67 + SortOptions []string `json:"sort,omitempty"`
68 }
69
70 func (fsrv *FileServer) serveBrowse(fileSystem fs.FS, root, dirPath string, w http.ResponseWriter, r *http.Request, next caddyhttp.Handler) error {
@@ -210,7 +221,7 @@ func (fsrv *FileServer) browseApplyQueryParams(w http.ResponseWriter, r *http.Re
221
222 // The configs in Caddyfile have lower priority than Query params,
223 // so put it at first.
213 - for idx, item := range fsrv.SortOptions {
224 + for idx, item := range fsrv.Browse.SortOptions {
225 // Only `sort` & `order`, 2 params are allowed
226 if idx >= 2 {
227 break
modules/caddyhttp/fileserver/caddyfile.go
+10 -11
@@ -119,6 +119,16 @@ func (fsrv *FileServer) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
119 return d.Err("Symlinks path reveal is already enabled")
120 }
121 fsrv.Browse.RevealSymlinks = true
122 + case "sort":
123 + for d.NextArg() {
124 + dVal := d.Val()
125 + switch dVal {
126 + case sortByName, sortByNameDirFirst, sortBySize, sortByTime, sortOrderAsc, sortOrderDesc:
127 + fsrv.Browse.SortOptions = append(fsrv.Browse.SortOptions, dVal)
128 + default:
129 + return d.Errf("unknown sort option '%s'", dVal)
130 + }
131 + }
132 default:
133 return d.Errf("unknown subdirective '%s'", d.Val())
134 }
@@ -171,17 +181,6 @@ func (fsrv *FileServer) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
181 }
182 fsrv.EtagFileExtensions = etagFileExtensions
183
174 - case "sort":
175 - for d.NextArg() {
176 - dVal := d.Val()
177 - switch dVal {
178 - case sortByName, sortBySize, sortByTime, sortOrderAsc, sortOrderDesc:
179 - fsrv.SortOptions = append(fsrv.SortOptions, dVal)
180 - default:
181 - return d.Errf("unknown sort option '%s'", dVal)
182 - }
183 - }
184 -
184 default:
185 return d.Errf("unknown subdirective '%s'", d.Val())
186 }
modules/caddyhttp/fileserver/staticfiles.go
+14 -22
@@ -153,16 +153,6 @@ type FileServer struct {
153 // a 404 error. By default, this is false (disabled).
154 PassThru bool `json:"pass_thru,omitempty"`
155
156 - // Override the default sort.
157 - // It includes the following options:
158 - // - sort_by: name(default), namedirfirst, size, time
159 - // - order: asc(default), desc
160 - // eg.:
161 - // - `sort time desc` will sort by time in descending order
162 - // - `sort size` will sort by size in ascending order
163 - // The first option must be `sort_by` and the second option must be `order` (if exists).
164 - SortOptions []string `json:"sort,omitempty"`
165 -
156 // Selection of encoders to use to check for precompressed files.
157 PrecompressedRaw caddy.ModuleMap `json:"precompressed,omitempty" caddy:"namespace=http.precompressed"`
158
@@ -246,19 +236,21 @@ func (fsrv *FileServer) Provision(ctx caddy.Context) error {
236 fsrv.precompressors[ae] = p
237 }
238
249 - // check sort options
250 - for idx, sortOption := range fsrv.SortOptions {
251 - switch idx {
252 - case 0:
253 - if sortOption != sortByName && sortOption != sortByNameDirFirst && sortOption != sortBySize && sortOption != sortByTime {
254 - return fmt.Errorf("the first option must be one of the following: %s, %s, %s, %s, but got %s", sortByName, sortByNameDirFirst, sortBySize, sortByTime, sortOption)
255 - }
256 - case 1:
257 - if sortOption != sortOrderAsc && sortOption != sortOrderDesc {
258 - return fmt.Errorf("the second option must be one of the following: %s, %s, but got %s", sortOrderAsc, sortOrderDesc, sortOption)
239 + if fsrv.Browse != nil {
240 + // check sort options
241 + for idx, sortOption := range fsrv.Browse.SortOptions {
242 + switch idx {
243 + case 0:
244 + if sortOption != sortByName && sortOption != sortByNameDirFirst && sortOption != sortBySize && sortOption != sortByTime {
245 + return fmt.Errorf("the first option must be one of the following: %s, %s, %s, %s, but got %s", sortByName, sortByNameDirFirst, sortBySize, sortByTime, sortOption)
246 + }
247 + case 1:
248 + if sortOption != sortOrderAsc && sortOption != sortOrderDesc {
249 + return fmt.Errorf("the second option must be one of the following: %s, %s, but got %s", sortOrderAsc, sortOrderDesc, sortOption)
250 + }
251 + default:
252 + return fmt.Errorf("only max 2 sort options are allowed, but got %d", idx+1)
253 }
260 - default:
261 - return fmt.Errorf("only max 2 sort options are allowed, but got %d", idx+1)
254 }
255 }
256