Fast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS
Mirrored from https://github.com/Slazee/caddy.git
Synced Nov 14, 05:15 UTC
httpcaddyfile: Global storage configuration (closes #2758)
Matthew Holt committed
Sep 19, 2019 at 12:42 UTC
ba29f9d41d7951bde07dc2e0d6a1471c40bb7145
8 files changed
+98
-40
caddyconfig/httpcaddyfile/httptype.go
+10
-4
@@ -57,15 +57,18 @@ func (st ServerType) Setup(originalServerBlocks []caddyfile.ServerBlock,
57
dir := segment.Directive()
58
var val interface{}
59
var err error
60
+ disp := caddyfile.NewDispenser(segment)
61
switch dir {
62
case "http_port":
62
- val, err = parseHTTPPort(caddyfile.NewDispenser(segment))
63
+ val, err = parseOptHTTPPort(disp)
64
case "https_port":
64
- val, err = parseHTTPSPort(caddyfile.NewDispenser(segment))
65
+ val, err = parseOptHTTPSPort(disp)
66
case "handler_order":
66
- val, err = parseHandlerOrder(caddyfile.NewDispenser(segment))
67
+ val, err = parseOptHandlerOrder(disp)
68
case "experimental_http3":
68
- val, err = parseExperimentalHTTP3(caddyfile.NewDispenser(segment))
69
+ val, err = parseOptExperimentalHTTP3(disp)
70
+ case "storage":
71
+ val, err = parseOptStorage(disp)
72
default:
73
return nil, warnings, fmt.Errorf("unrecognized parameter name: %s", dir)
74
}
@@ -207,6 +210,9 @@ func (st ServerType) Setup(originalServerBlocks []caddyfile.ServerBlock,
210
if !reflect.DeepEqual(tlsApp, caddytls.TLS{}) {
211
cfg.AppsRaw["tls"] = caddyconfig.JSON(tlsApp, &warnings)
212
}
213
+ if storageCvtr, ok := options["storage"].(caddy.StorageConverter); ok {
214
+ cfg.StorageRaw = caddyconfig.JSON(storageCvtr, &warnings)
215
+ }
216
217
return cfg, warnings, nil
218
}
caddyconfig/httpcaddyfile/options.go
+34
-4
@@ -15,12 +15,14 @@
15
package httpcaddyfile
16
17
import (
18
+ "fmt"
19
"strconv"
20
21
+ "github.com/caddyserver/caddy/v2"
22
"github.com/caddyserver/caddy/v2/caddyconfig/caddyfile"
23
)
24
23
-func parseHTTPPort(d *caddyfile.Dispenser) (int, error) {
25
+func parseOptHTTPPort(d *caddyfile.Dispenser) (int, error) {
26
var httpPort int
27
for d.Next() {
28
var httpPortStr string
@@ -36,7 +38,7 @@ func parseHTTPPort(d *caddyfile.Dispenser) (int, error) {
38
return httpPort, nil
39
}
40
39
-func parseHTTPSPort(d *caddyfile.Dispenser) (int, error) {
41
+func parseOptHTTPSPort(d *caddyfile.Dispenser) (int, error) {
42
var httpsPort int
43
for d.Next() {
44
var httpsPortStr string
@@ -52,11 +54,11 @@ func parseHTTPSPort(d *caddyfile.Dispenser) (int, error) {
54
return httpsPort, nil
55
}
56
55
-func parseExperimentalHTTP3(d *caddyfile.Dispenser) (bool, error) {
57
+func parseOptExperimentalHTTP3(d *caddyfile.Dispenser) (bool, error) {
58
return true, nil
59
}
60
59
-func parseHandlerOrder(d *caddyfile.Dispenser) ([]string, error) {
61
+func parseOptHandlerOrder(d *caddyfile.Dispenser) ([]string, error) {
62
if !d.Next() {
63
return nil, d.ArgErr()
64
}
@@ -78,3 +80,31 @@ func parseHandlerOrder(d *caddyfile.Dispenser) ([]string, error) {
80
}
81
return order, nil
82
}
83
+
84
+func parseOptStorage(d *caddyfile.Dispenser) (caddy.StorageConverter, error) {
85
+ if !d.Next() {
86
+ return nil, d.ArgErr()
87
+ }
88
+ args := d.RemainingArgs()
89
+ if len(args) != 1 {
90
+ return nil, d.ArgErr()
91
+ }
92
+ modName := args[0]
93
+ mod, err := caddy.GetModule("caddy.storage." + modName)
94
+ if err != nil {
95
+ return nil, fmt.Errorf("getting storage module '%s': %v", modName, err)
96
+ }
97
+ unm, ok := mod.New().(caddyfile.Unmarshaler)
98
+ if !ok {
99
+ return nil, fmt.Errorf("storage module '%s' is not a Caddyfile unmarshaler", mod.Name)
100
+ }
101
+ err = unm.UnmarshalCaddyfile(d.NewFromNextTokens())
102
+ if err != nil {
103
+ return nil, err
104
+ }
105
+ storage, ok := unm.(caddy.StorageConverter)
106
+ if !ok {
107
+ return nil, fmt.Errorf("module %s is not a StorageConverter", mod.Name)
108
+ }
109
+ return storage, nil
110
+}
cmd/caddy/main.go
+1
@@ -34,6 +34,7 @@ import (
34
_ "github.com/caddyserver/caddy/v2/modules/caddyhttp/templates"
35
_ "github.com/caddyserver/caddy/v2/modules/caddytls"
36
_ "github.com/caddyserver/caddy/v2/modules/caddytls/standardstek"
37
+ _ "github.com/caddyserver/caddy/v2/modules/filestorage"
38
)
39
40
func main() {
go.mod
+1
-1
@@ -7,7 +7,7 @@ require (
7
github.com/Masterminds/goutils v1.1.0 // indirect
8
github.com/Masterminds/semver v1.4.2 // indirect
9
github.com/Masterminds/sprig v2.20.0+incompatible
10
- github.com/andybalholm/brotli v0.0.0-20190704151324-71eb68cc467c
10
+ github.com/andybalholm/brotli v0.0.0-20190821151343-b60f0d972eeb
11
github.com/dustin/go-humanize v1.0.0
12
github.com/go-acme/lego/v3 v3.0.2
13
github.com/google/go-cmp v0.3.1 // indirect
go.sum
+2
-6
@@ -34,8 +34,8 @@ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuy
34
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
35
github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190808125512-07798873deee/go.mod h1:myCDvQSzCW+wB1WAlocEru4wMGJxy+vlxHdhegi1CDQ=
36
github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20190307165228-86c17b95fcd5/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
37
-github.com/andybalholm/brotli v0.0.0-20190704151324-71eb68cc467c h1:pBKtfXLqKZ+GPHGjlBheGaXK2lddydUG3XhWGrYjxOA=
38
-github.com/andybalholm/brotli v0.0.0-20190704151324-71eb68cc467c/go.mod h1:+lx6/Aqd1kLJ1GQfkvOnaZ1WGmLpMpbprPuIOOZX30U=
37
+github.com/andybalholm/brotli v0.0.0-20190821151343-b60f0d972eeb h1:ZSlUsEd11C/uRzhZHOgANARJ03fkwmjJEa6g2Cqjlo4=
38
+github.com/andybalholm/brotli v0.0.0-20190821151343-b60f0d972eeb/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
39
github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
40
github.com/aws/aws-sdk-go v1.23.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
41
github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc=
@@ -78,8 +78,6 @@ github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRx
78
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
79
github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
80
github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A=
81
-github.com/golang/gddo v0.0.0-20190419222130-af0f2af80721 h1:KRMr9A3qfbVM7iV/WcLY/rL5LICqwMHLhwRXKu99fXw=
82
-github.com/golang/gddo v0.0.0-20190419222130-af0f2af80721/go.mod h1:xEhNfoBDX1hzLm2Nf80qUvZ2sVwoMZ8d6IE2SrsQfh4=
81
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
82
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
83
github.com/golang/mock v1.2.0 h1:28o5sBqPkBsMGnC6b4MvE2TzSr5/AT4c/1fLqVGIwlk=
@@ -158,8 +156,6 @@ github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzp
156
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
157
github.com/mattn/go-tty v0.0.0-20180219170247-931426f7535a/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE=
158
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
161
-github.com/mholt/certmagic v0.7.2 h1:i4FRZyM33Ke6UdTrq69hLSRq1xvqS83JQTkzzUWtuF4=
162
-github.com/mholt/certmagic v0.7.2/go.mod h1:hqHzDsY32TwZpj/KswVylheSISjquF/eOVOaJTYV15w=
159
github.com/miekg/dns v1.1.15 h1:CSSIDtllwGLMoA6zjdKnaE6Tx6eVUxQ29LUgGetiDCI=
160
github.com/miekg/dns v1.1.15/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
161
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
modules/caddyhttp/encode/caddyfile.go
+1
-1
@@ -68,7 +68,7 @@ func (enc *Encode) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
68
name := d.Val()
69
mod, err := caddy.GetModule("http.encoders." + name)
70
if err != nil {
71
- return fmt.Errorf("getting encoder module '%s': %v", mod.Name, err)
71
+ return fmt.Errorf("getting encoder module '%s': %v", name, err)
72
}
73
unm, ok := mod.New().(caddyfile.Unmarshaler)
74
if !ok {
modules/filestorage/filestorage.go
new
+49
@@ -0,0 +1,49 @@
1
+package filestorage
2
+
3
+import (
4
+ "github.com/caddyserver/caddy/v2"
5
+ "github.com/caddyserver/caddy/v2/caddyconfig/caddyfile"
6
+ "github.com/mholt/certmagic"
7
+)
8
+
9
+func init() {
10
+ caddy.RegisterModule(FileStorage{})
11
+}
12
+
13
+// FileStorage is a certmagic.Storage wrapper for certmagic.FileStorage.
14
+type FileStorage struct {
15
+ Root string `json:"root,omitempty"`
16
+}
17
+
18
+// CaddyModule returns the Caddy module information.
19
+func (FileStorage) CaddyModule() caddy.ModuleInfo {
20
+ return caddy.ModuleInfo{
21
+ Name: "caddy.storage.file_system",
22
+ New: func() caddy.Module { return new(FileStorage) },
23
+ }
24
+}
25
+
26
+// CertMagicStorage converts s to a certmagic.Storage instance.
27
+func (s FileStorage) CertMagicStorage() (certmagic.Storage, error) {
28
+ return &certmagic.FileStorage{Path: s.Root}, nil
29
+}
30
+
31
+// UnmarshalCaddyfile sets up the storage module from Caddyfile tokens.
32
+func (s *FileStorage) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
33
+ if !d.Next() {
34
+ return d.Err("expected tokens")
35
+ }
36
+ for nesting := d.Nesting(); d.NextBlock(nesting); {
37
+ if !d.NextArg() {
38
+ return d.ArgErr()
39
+ }
40
+ s.Root = d.Val()
41
+ if d.NextArg() {
42
+ return d.ArgErr()
43
+ }
44
+ }
45
+ return nil
46
+}
47
+
48
+// Interface guard
49
+var _ caddy.StorageConverter = (*FileStorage)(nil)
storage.go
-24
@@ -22,10 +22,6 @@ import (
22
"github.com/mholt/certmagic"
23
)
24
25
-func init() {
26
- RegisterModule(fileStorage{})
27
-}
28
-
25
// StorageConverter is a type that can convert itself
26
// to a valid, usable certmagic.Storage value. (The
27
// value might be short-lived.) This interface allows
@@ -35,23 +31,6 @@ type StorageConverter interface {
31
CertMagicStorage() (certmagic.Storage, error)
32
}
33
38
-// fileStorage is a certmagic.Storage wrapper for certmagic.FileStorage.
39
-type fileStorage struct {
40
- Root string `json:"root"`
41
-}
42
-
43
-// CaddyModule returns the Caddy module information.
44
-func (fileStorage) CaddyModule() ModuleInfo {
45
- return ModuleInfo{
46
- Name: "caddy.storage.file_system",
47
- New: func() Module { return new(fileStorage) },
48
- }
49
-}
50
-
51
-func (s fileStorage) CertMagicStorage() (certmagic.Storage, error) {
52
- return &certmagic.FileStorage{Path: s.Root}, nil
53
-}
54
-
34
// homeDir returns the best guess of the current user's home
35
// directory from environment variables. If unknown, "." (the
36
// current directory) is returned instead.
@@ -80,6 +59,3 @@ func dataDir() string {
59
}
60
return filepath.Join(baseDir, "caddy")
61
}
83
-
84
-// Interface guard
85
-var _ StorageConverter = fileStorage{}