@marcel91200 / caddy Mirror · read-only / commits / 362f33da
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, 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 }