Skip to content

Commit 362f33d

Browse files
ddemoss222mholt
andauthored
fileserver: New --precompressed flag (#5880)
exposes the file_server precompressed functionality to be used with the file-server command Co-authored-by: Matt Holt <[email protected]>
1 parent 3d7d60f commit 362f33d

File tree

1 file changed

+33
-2
lines changed

1 file changed

+33
-2
lines changed

modules/caddyhttp/fileserver/command.go

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package fileserver
1616

1717
import (
1818
"encoding/json"
19+
"fmt"
1920
"io"
2021
"log"
2122
"os"
@@ -31,13 +32,14 @@ import (
3132
"github.com/caddyserver/caddy/v2"
3233
"github.com/caddyserver/caddy/v2/caddyconfig"
3334
"github.com/caddyserver/caddy/v2/modules/caddyhttp"
35+
"github.com/caddyserver/caddy/v2/modules/caddyhttp/encode"
3436
caddytpl "github.com/caddyserver/caddy/v2/modules/caddyhttp/templates"
3537
)
3638

3739
func init() {
3840
caddycmd.RegisterCommand(caddycmd.Command{
3941
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]",
4143
Short: "Spins up a production-ready file server",
4244
Long: `
4345
A simple but production-ready file server. Useful for quick deployments,
@@ -60,6 +62,7 @@ respond with a file listing.`,
6062
cmd.Flags().BoolP("templates", "t", false, "Enable template rendering")
6163
cmd.Flags().BoolP("access-log", "a", false, "Enable the access log")
6264
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.")
6366
cmd.RunE = caddycmd.WrapCommandFuncForCobra(cmdFileServer)
6467
cmd.AddCommand(&cobra.Command{
6568
Use: "export-template",
@@ -84,6 +87,10 @@ func cmdFileServer(fs caddycmd.Flags) (int, error) {
8487
templates := fs.Bool("templates")
8588
accessLog := fs.Bool("access-log")
8689
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+
}
8794

8895
var handlers []json.RawMessage
8996

@@ -93,6 +100,30 @@ func cmdFileServer(fs caddycmd.Flags) (int, error) {
93100
}
94101

95102
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+
96127
if browse {
97128
handler.Browse = new(Browse)
98129
}
@@ -154,7 +185,7 @@ func cmdFileServer(fs caddycmd.Flags) (int, error) {
154185
}
155186
}
156187

157-
err := caddy.Run(cfg)
188+
err = caddy.Run(cfg)
158189
if err != nil {
159190
return caddy.ExitCodeFailedStartup, err
160191
}

0 commit comments

Comments
 (0)