@marcel91200 / caddy Mirror · read-only / commits / b687d7b9
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 13, 18:00 UTC

httpcaddyfile: Support multiple values for `default_bind` (#4774)

* httpcaddyfile: Support multiple values for `default_bind` * Fix ordering of server blocks

Francis Lavoie committed May 8, 2022 at 21:32 UTC b687d7b9670890efd8dc065fb7a025cd0c3a1445
3 files changed +29 -8
caddyconfig/httpcaddyfile/addresses.go
+14 -4
@@ -102,12 +102,20 @@ func (st *ServerType) mapAddressToServerBlocks(originalServerBlocks []serverBloc
102 }
103 }
104
105 + // make a slice of the map keys so we can iterate in sorted order
106 + addrs := make([]string, 0, len(addrToKeys))
107 + for k := range addrToKeys {
108 + addrs = append(addrs, k)
109 + }
110 + sort.Strings(addrs)
111 +
112 // now that we know which addresses serve which keys of this
113 // server block, we iterate that mapping and create a list of
114 // new server blocks for each address where the keys of the
115 // server block are only the ones which use the address; but
116 // the contents (tokens) are of course the same
110 - for addr, keys := range addrToKeys {
117 + for _, addr := range addrs {
118 + keys := addrToKeys[addr]
119 // parse keys so that we only have to do it once
120 parsedKeys := make([]Address, 0, len(keys))
121 for _, key := range keys {
@@ -161,6 +169,7 @@ func (st *ServerType) consolidateAddrMappings(addrToServerBlocks map[string][]se
169 delete(addrToServerBlocks, otherAddr)
170 }
171 }
172 + sort.Strings(a.addresses)
173
174 sbaddrs = append(sbaddrs, a)
175 }
@@ -208,13 +217,13 @@ func (st *ServerType) listenerAddrsForServerBlockKey(sblock serverBlock, key str
217 }
218
219 // the bind directive specifies hosts, but is optional
211 - lnHosts := make([]string, 0, len(sblock.pile))
220 + lnHosts := make([]string, 0, len(sblock.pile["bind"]))
221 for _, cfgVal := range sblock.pile["bind"] {
222 lnHosts = append(lnHosts, cfgVal.Value.([]string)...)
223 }
224 if len(lnHosts) == 0 {
216 - if defaultBind, ok := options["default_bind"].(string); ok {
217 - lnHosts = []string{defaultBind}
225 + if defaultBind, ok := options["default_bind"].([]string); ok {
226 + lnHosts = defaultBind
227 } else {
228 lnHosts = []string{""}
229 }
@@ -236,6 +245,7 @@ func (st *ServerType) listenerAddrsForServerBlockKey(sblock serverBlock, key str
245 for lnStr := range listeners {
246 listenersList = append(listenersList, lnStr)
247 }
248 + sort.Strings(listenersList)
249
250 return listenersList, nil
251 }
caddyconfig/httpcaddyfile/options.go
+10 -1
@@ -29,7 +29,7 @@ func init() {
29 RegisterGlobalOption("debug", parseOptTrue)
30 RegisterGlobalOption("http_port", parseOptHTTPPort)
31 RegisterGlobalOption("https_port", parseOptHTTPSPort)
32 - RegisterGlobalOption("default_bind", parseOptSingleString)
32 + RegisterGlobalOption("default_bind", parseOptStringList)
33 RegisterGlobalOption("grace_period", parseOptDuration)
34 RegisterGlobalOption("default_sni", parseOptSingleString)
35 RegisterGlobalOption("order", parseOptOrder)
@@ -279,6 +279,15 @@ func parseOptSingleString(d *caddyfile.Dispenser, _ interface{}) (interface{}, e
279 return val, nil
280 }
281
282 +func parseOptStringList(d *caddyfile.Dispenser, _ interface{}) (interface{}, error) {
283 + d.Next() // consume parameter name
284 + val := d.RemainingArgs()
285 + if len(val) == 0 {
286 + return "", d.ArgErr()
287 + }
288 + return val, nil
289 +}
290 +
291 func parseOptAdmin(d *caddyfile.Dispenser, _ interface{}) (interface{}, error) {
292 adminCfg := new(caddy.AdminConfig)
293 for d.Next() {
caddytest/integration/caddyfile_adapt/global_options_default_bind.txt
+5 -3
@@ -1,5 +1,5 @@
1 {
2 - default_bind tcp4/0.0.0.0
2 + default_bind tcp4/0.0.0.0 tcp6/[::]
3 }
4
5 example.com {
@@ -14,7 +14,8 @@ example.org:12345 {
14 "servers": {
15 "srv0": {
16 "listen": [
17 - "tcp4/0.0.0.0:12345"
17 + "tcp4/0.0.0.0:12345",
18 + "tcp6/[::]:12345"
19 ],
20 "routes": [
21 {
@@ -31,7 +32,8 @@ example.org:12345 {
32 },
33 "srv1": {
34 "listen": [
34 - "tcp4/0.0.0.0:443"
35 + "tcp4/0.0.0.0:443",
36 + "tcp6/[::]:443"
37 ],
38 "routes": [
39 {