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
)