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, 19:30 UTC
fileserver: New --precompressed flag (#5880)
exposes the file_server precompressed functionality to be used with the file-server command Co-authored-by: Matt Holt <mholt@users.noreply.github.com>
David DeMoss committed
Dec 13, 2023 at 21:26 UTC
362f33daae13c31e6d7d5e73fb79aba5a1e9deef
1 file changed
+33
-2
modules/caddyhttp/fileserver/command.go
+33
-2
@@ -16,6 +16,7 @@ package fileserver
16
17
import (
18
"encoding/json"
19
+ "fmt"
20
"io"
21
"log"
22
"os"
@@ -31,13 +32,14 @@ import (
32
"github.com/caddyserver/caddy/v2"
33
"github.com/caddyserver/caddy/v2/caddyconfig"
34
"github.com/caddyserver/caddy/v2/modules/caddyhttp"
35
+ "github.com/caddyserver/caddy/v2/modules/caddyhttp/encode"
36
caddytpl "github.com/caddyserver/caddy/v2/modules/caddyhttp/templates"
37
)
38
39
func init() {
40
caddycmd.RegisterCommand(caddycmd.Command{
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]",
43
Short: "Spins up a production-ready file server",
44
Long: `
45
A simple but production-ready file server. Useful for quick deployments,
@@ -60,6 +62,7 @@ respond with a file listing.`,
62
cmd.Flags().BoolP("templates", "t", false, "Enable template rendering")
63
cmd.Flags().BoolP("access-log", "a", false, "Enable the access log")
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.")
66
cmd.RunE = caddycmd.WrapCommandFuncForCobra(cmdFileServer)
67
cmd.AddCommand(&cobra.Command{
68
Use: "export-template",
@@ -84,6 +87,10 @@ func cmdFileServer(fs caddycmd.Flags) (int, error) {
87
templates := fs.Bool("templates")
88
accessLog := fs.Bool("access-log")
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
+ }
94
95
var handlers []json.RawMessage
96
@@ -93,6 +100,30 @@ func cmdFileServer(fs caddycmd.Flags) (int, error) {
100
}
101
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
+
127
if browse {
128
handler.Browse = new(Browse)
129
}
@@ -154,7 +185,7 @@ func cmdFileServer(fs caddycmd.Flags) (int, error) {
185
}
186
}
187
157
- err := caddy.Run(cfg)
188
+ err = caddy.Run(cfg)
189
if err != nil {
190
return caddy.ExitCodeFailedStartup, err
191
}