func parseBlock(c *parse.Dispenser, u *staticUpstream) error { switch c.Val() { case "policy": if !c.NextArg() { return c.ArgErr() } policyCreateFunc, ok := supportedPolicies[c.Val()] if !ok { return c.ArgErr() } u.Policy = policyCreateFunc() case "fail_timeout": if !c.NextArg() { return c.ArgErr() } dur, err := time.ParseDuration(c.Val()) if err != nil { return err } u.FailTimeout = dur case "max_fails": if !c.NextArg() { return c.ArgErr() } n, err := strconv.Atoi(c.Val()) if err != nil { return err } u.MaxFails = int32(n) case "health_check": if !c.NextArg() { return c.ArgErr() } var err error u.HealthCheck.Path, u.HealthCheck.Port, err = net.SplitHostPort(c.Val()) if err != nil { return err } u.HealthCheck.Interval = 30 * time.Second if c.NextArg() { dur, err := time.ParseDuration(c.Val()) if err != nil { return err } u.HealthCheck.Interval = dur } case "without": if !c.NextArg() { return c.ArgErr() } u.WithoutPathPrefix = c.Val() case "except": ignoredDomains := c.RemainingArgs() if len(ignoredDomains) == 0 { return c.ArgErr() } for i := 0; i < len(ignoredDomains); i++ { ignoredDomains[i] = strings.ToLower(dns.Fqdn(ignoredDomains[i])) } u.IgnoredSubDomains = ignoredDomains case "spray": u.Spray = &Spray{} default: return c.Errf("unknown property '%s'", c.Val()) } return nil }