@marcel91200 / caddy Mirror · read-only / commits / ba29f9d4
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 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{}