@@ -16,6 +16,7 @@ package fileserver
16
16
17
17
import (
18
18
"encoding/json"
19
+ "fmt"
19
20
"io"
20
21
"log"
21
22
"os"
@@ -31,13 +32,14 @@ import (
31
32
"github.com/caddyserver/caddy/v2"
32
33
"github.com/caddyserver/caddy/v2/caddyconfig"
33
34
"github.com/caddyserver/caddy/v2/modules/caddyhttp"
35
+ "github.com/caddyserver/caddy/v2/modules/caddyhttp/encode"
34
36
caddytpl "github.com/caddyserver/caddy/v2/modules/caddyhttp/templates"
35
37
)
36
38
37
39
func init () {
38
40
caddycmd .RegisterCommand (caddycmd.Command {
39
41
Name : "file-server" ,
40
- Usage : "[--domain <example.com>] [--root <path>] [--listen <addr>] [--browse] [--access-log]" ,
42
+ Usage : "[--domain <example.com>] [--root <path>] [--listen <addr>] [--browse] [--access-log] [--precompressed] " ,
41
43
Short : "Spins up a production-ready file server" ,
42
44
Long : `
43
45
A simple but production-ready file server. Useful for quick deployments,
@@ -60,6 +62,7 @@ respond with a file listing.`,
60
62
cmd .Flags ().BoolP ("templates" , "t" , false , "Enable template rendering" )
61
63
cmd .Flags ().BoolP ("access-log" , "a" , false , "Enable the access log" )
62
64
cmd .Flags ().BoolP ("debug" , "v" , false , "Enable verbose debug logs" )
65
+ cmd .Flags ().StringSliceP ("precompressed" , "p" , []string {}, "Specify precompression file extensions. Compression preference implied from flag order." )
63
66
cmd .RunE = caddycmd .WrapCommandFuncForCobra (cmdFileServer )
64
67
cmd .AddCommand (& cobra.Command {
65
68
Use : "export-template" ,
@@ -84,6 +87,10 @@ func cmdFileServer(fs caddycmd.Flags) (int, error) {
84
87
templates := fs .Bool ("templates" )
85
88
accessLog := fs .Bool ("access-log" )
86
89
debug := fs .Bool ("debug" )
90
+ precompressed , err := fs .GetStringSlice ("precompressed" )
91
+ if err != nil {
92
+ return caddy .ExitCodeFailedStartup , fmt .Errorf ("invalid precompressed flag: %v" , err )
93
+ }
87
94
88
95
var handlers []json.RawMessage
89
96
@@ -93,6 +100,30 @@ func cmdFileServer(fs caddycmd.Flags) (int, error) {
93
100
}
94
101
95
102
handler := FileServer {Root : root }
103
+
104
+ if len (precompressed ) != 0 {
105
+ // logic mirrors modules/caddyhttp/fileserver/caddyfile.go case "precompressed"
106
+ var order []string
107
+ for _ , compression := range precompressed {
108
+ modID := "http.precompressed." + compression
109
+ mod , err := caddy .GetModule (modID )
110
+ if err != nil {
111
+ return caddy .ExitCodeFailedStartup , fmt .Errorf ("getting module named '%s': %v" , modID , err )
112
+ }
113
+ inst := mod .New ()
114
+ precompress , ok := inst .(encode.Precompressed )
115
+ if ! ok {
116
+ return caddy .ExitCodeFailedStartup , fmt .Errorf ("module %s is not a precompressor; is %T" , modID , inst )
117
+ }
118
+ if handler .PrecompressedRaw == nil {
119
+ handler .PrecompressedRaw = make (caddy.ModuleMap )
120
+ }
121
+ handler .PrecompressedRaw [compression ] = caddyconfig .JSON (precompress , nil )
122
+ order = append (order , compression )
123
+ }
124
+ handler .PrecompressedOrder = order
125
+ }
126
+
96
127
if browse {
97
128
handler .Browse = new (Browse )
98
129
}
@@ -154,7 +185,7 @@ func cmdFileServer(fs caddycmd.Flags) (int, error) {
154
185
}
155
186
}
156
187
157
- err : = caddy .Run (cfg )
188
+ err = caddy .Run (cfg )
158
189
if err != nil {
159
190
return caddy .ExitCodeFailedStartup , err
160
191
}
0 commit comments