@marcel91200 / caddy Mirror · read-only / commits / 7f2a93e6
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, 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