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
{