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, 06:45 UTC
caddyfile: Allow overriding server names (#5323)
Francis Lavoie committed
Jan 27, 2023 at 14:56 UTC
7f2a93e6c36ceec9e007baeedeb594ab0dc43a71
3 files changed
+114
-2
caddyconfig/httpcaddyfile/httptype.go
+1
-1
@@ -706,7 +706,7 @@ func (st *ServerType) serversFromPairings(
706
707
err := applyServerOptions(servers, options, warnings)
708
if err != nil {
709
- return nil, err
709
+ return nil, fmt.Errorf("applying global server options: %v", err)
710
}
711
712
return servers, nil
caddyconfig/httpcaddyfile/serveroptions.go
+36
-1
@@ -33,6 +33,7 @@ type serverOptions struct {
33
ListenerAddress string
34
35
// These will all map 1:1 to the caddyhttp.Server struct
36
+ Name string
37
ListenerWrappersRaw []json.RawMessage
38
ReadTimeout caddy.Duration
39
ReadHeaderTimeout caddy.Duration
@@ -58,6 +59,15 @@ func unmarshalCaddyfileServerOptions(d *caddyfile.Dispenser) (any, error) {
59
}
60
for nesting := d.Nesting(); d.NextBlock(nesting); {
61
switch d.Val() {
62
+ case "name":
63
+ if serverOpts.ListenerAddress == "" {
64
+ return nil, d.Errf("cannot set a name for a server without a listener address")
65
+ }
66
+ if !d.NextArg() {
67
+ return nil, d.ArgErr()
68
+ }
69
+ serverOpts.Name = d.Val()
70
+
71
case "listener_wrappers":
72
for nesting := d.Nesting(); d.NextBlock(nesting); {
73
modID := "caddy.listeners." + d.Val()
@@ -248,7 +258,22 @@ func applyServerOptions(
258
return nil
259
}
260
251
- for _, server := range servers {
261
+ // check for duplicate names, which would clobber the config
262
+ existingNames := map[string]bool{}
263
+ for _, opts := range serverOpts {
264
+ if opts.Name == "" {
265
+ continue
266
+ }
267
+ if existingNames[opts.Name] {
268
+ return fmt.Errorf("cannot use duplicate server name '%s'", opts.Name)
269
+ }
270
+ existingNames[opts.Name] = true
271
+ }
272
+
273
+ // collect the server name overrides
274
+ nameReplacements := map[string]string{}
275
+
276
+ for key, server := range servers {
277
// find the options that apply to this server
278
opts := func() *serverOptions {
279
for _, entry := range serverOpts {
@@ -287,6 +312,16 @@ func applyServerOptions(
312
}
313
server.Logs.ShouldLogCredentials = opts.ShouldLogCredentials
314
}
315
+
316
+ if opts.Name != "" {
317
+ nameReplacements[key] = opts.Name
318
+ }
319
+ }
320
+
321
+ // rename the servers if marked to do so
322
+ for old, new := range nameReplacements {
323
+ servers[new] = servers[old]
324
+ delete(servers, old)
325
}
326
327
return nil
caddytest/integration/caddyfile_adapt/server_names.txt
new
+77
@@ -0,0 +1,77 @@
1
+{
2
+ servers :443 {
3
+ name https
4
+ }
5
+
6
+ servers :8000 {
7
+ name app1
8
+ }
9
+
10
+ servers :8001 {
11
+ name app2
12
+ }
13
+
14
+ servers 123.123.123.123:8002 {
15
+ name bind-server
16
+ }
17
+}
18
+
19
+example.com {
20
+}
21
+
22
+:8000 {
23
+}
24
+
25
+:8001, :8002 {
26
+}
27
+
28
+:8002 {
29
+ bind 123.123.123.123 222.222.222.222
30
+}
31
+----------
32
+{
33
+ "apps": {
34
+ "http": {
35
+ "servers": {
36
+ "app1": {
37
+ "listen": [
38
+ ":8000"
39
+ ]
40
+ },
41
+ "app2": {
42
+ "listen": [
43
+ ":8001"
44
+ ]
45
+ },
46
+ "bind-server": {
47
+ "listen": [
48
+ "123.123.123.123:8002",
49
+ "222.222.222.222:8002"
50
+ ]
51
+ },
52
+ "https": {
53
+ "listen": [
54
+ ":443"
55
+ ],
56
+ "routes": [
57
+ {
58
+ "match": [
59
+ {
60
+ "host": [
61
+ "example.com"
62
+ ]
63
+ }
64
+ ],
65
+ "terminal": true
66
+ }
67
+ ]
68
+ },
69
+ "srv4": {
70
+ "listen": [
71
+ ":8002"
72
+ ]
73
+ }
74
+ }
75
+ }
76
+ }
77
+}
\ No newline at end of file