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