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
This commit is contained in:
Matthew Holt 2019-11-04 12:54:46 -07:00
parent 7129f6c1c0
commit bf363f061d
No known key found for this signature in database
GPG Key ID: 2A349DD577D586A5
2 changed files with 31 additions and 5 deletions

View File

@ -437,12 +437,18 @@ type Duration time.Duration
// UnmarshalJSON satisfies json.Unmarshaler.
func (d *Duration) UnmarshalJSON(b []byte) error {
dd, err := time.ParseDuration(strings.Trim(string(b), `"`))
if err != nil {
return err
if len(b) == 0 {
return io.EOF
}
*d = Duration(dd)
return nil
var dur time.Duration
var err error
if b[0] == byte('"') && b[len(b)-1] == byte('"') {
dur, err = time.ParseDuration(strings.Trim(string(b), `"`))
} else {
err = json.Unmarshal(b, &dur)
}
*d = Duration(dur)
return err
}
// GoModule returns the build info of this Caddy

View File

@ -20,10 +20,12 @@ import (
weakrand "math/rand"
"net"
"net/http"
"strconv"
"sync/atomic"
"time"
"github.com/caddyserver/caddy/v2"
"github.com/caddyserver/caddy/v2/caddyconfig/caddyfile"
)
func init() {
@ -87,6 +89,22 @@ func (RandomChoiceSelection) CaddyModule() caddy.ModuleInfo {
}
}
// UnmarshalCaddyfile sets up the module from Caddyfile tokens.
func (r *RandomChoiceSelection) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
for d.Next() {
if !d.NextArg() {
return d.ArgErr()
}
chooseStr := d.Val()
choose, err := strconv.Atoi(chooseStr)
if err != nil {
return d.Errf("invalid choice value '%s': %v", chooseStr, err)
}
r.Choose = choose
}
return nil
}
// Provision sets up r.
func (r *RandomChoiceSelection) Provision(ctx caddy.Context) error {
if r.Choose == 0 {
@ -350,4 +368,6 @@ var (
_ caddy.Validator = (*RandomChoiceSelection)(nil)
_ caddy.Provisioner = (*RandomChoiceSelection)(nil)
_ caddyfile.Unmarshaler = (*RandomChoiceSelection)(nil)
)