// NewStaticUpstreams parses the configuration input and sets up // static upstreams for the proxy middleware. func NewStaticUpstreams(c parse.Dispenser) ([]Upstream, error) { var upstreams []Upstream for c.Next() { upstream := &staticUpstream{ from: "", Hosts: nil, Policy: &Random{}, Spray: nil, FailTimeout: 10 * time.Second, MaxFails: 1, } if !c.Args(&upstream.from) { return upstreams, c.ArgErr() } to := c.RemainingArgs() if len(to) == 0 { return upstreams, c.ArgErr() } for _, host := range to { h, _, err := net.SplitHostPort(host) if err != nil { h = host } if x := net.ParseIP(h); x == nil { return upstreams, fmt.Errorf("not an IP address: `%s'", h) } } for c.NextBlock() { if err := parseBlock(&c, upstream); err != nil { return upstreams, err } } upstream.Hosts = make([]*UpstreamHost, len(to)) for i, host := range to { uh := &UpstreamHost{ Name: defaultHostPort(host), Conns: 0, Fails: 0, FailTimeout: upstream.FailTimeout, Unhealthy: false, CheckDown: func(upstream *staticUpstream) UpstreamHostDownFunc { return func(uh *UpstreamHost) bool { if uh.Unhealthy { return true } if uh.Fails >= upstream.MaxFails && upstream.MaxFails != 0 { return true } return false } }(upstream), WithoutPathPrefix: upstream.WithoutPathPrefix, } upstream.Hosts[i] = uh } if upstream.HealthCheck.Path != "" { go upstream.HealthCheckWorker(nil) } upstreams = append(upstreams, upstream) } return upstreams, nil }