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

reverse_proxy: Add UnmarshalCaddyfile for random_choose selection policy

Also allow caddy.Duration to be given integer values which are treated like regular time.Duration values (nanoseconds). Fixes #2856

Matthew Holt committed Nov 4, 2019 at 12:54 UTC bf363f061d03f33a8301466c9c0e2a89d75542c0
2 files changed +31 -5
caddy.go
+11 -5
@@ -437,12 +437,18 @@ type Duration time.Duration
437
438 // UnmarshalJSON satisfies json.Unmarshaler.
439 func (d *Duration) UnmarshalJSON(b []byte) error {
440 - dd, err := time.ParseDuration(strings.Trim(string(b), `"`))
441 - if err != nil {
442 - return err
440 + if len(b) == 0 {
441 + return io.EOF
442 }
444 - *d = Duration(dd)
445 - return nil
443 + var dur time.Duration
444 + var err error
445 + if b[0] == byte('"') && b[len(b)-1] == byte('"') {
446 + dur, err = time.ParseDuration(strings.Trim(string(b), `"`))
447 + } else {
448 + err = json.Unmarshal(b, &dur)
449 + }
450 + *d = Duration(dur)
451 + return err
452 }
453
454 // GoModule returns the build info of this Caddy
modules/caddyhttp/reverseproxy/selectionpolicies.go
+20
@@ -20,10 +20,12 @@ import (
20 weakrand "math/rand"
21 "net"
22 "net/http"
23 + "strconv"
24 "sync/atomic"
25 "time"
26
27 "github.com/caddyserver/caddy/v2"
28 + "github.com/caddyserver/caddy/v2/caddyconfig/caddyfile"
29 )
30
31 func init() {
@@ -87,6 +89,22 @@ func (RandomChoiceSelection) CaddyModule() caddy.ModuleInfo {
89 }
90 }
91
92 +// UnmarshalCaddyfile sets up the module from Caddyfile tokens.
93 +func (r *RandomChoiceSelection) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
94 + for d.Next() {
95 + if !d.NextArg() {
96 + return d.ArgErr()
97 + }
98 + chooseStr := d.Val()
99 + choose, err := strconv.Atoi(chooseStr)
100 + if err != nil {
101 + return d.Errf("invalid choice value '%s': %v", chooseStr, err)
102 + }
103 + r.Choose = choose
104 + }
105 + return nil
106 +}
107 +
108 // Provision sets up r.
109 func (r *RandomChoiceSelection) Provision(ctx caddy.Context) error {
110 if r.Choose == 0 {
@@ -350,4 +368,6 @@ var (
368
369 _ caddy.Validator = (*RandomChoiceSelection)(nil)
370 _ caddy.Provisioner = (*RandomChoiceSelection)(nil)
371 +
372 + _ caddyfile.Unmarshaler = (*RandomChoiceSelection)(nil)
373 )