// SetupIfMatcher parses `if` or `if_op` in the current dispenser block. // It returns a RequestMatcher and an error if any. func SetupIfMatcher(c caddyfile.Dispenser) (RequestMatcher, error) { var matcher IfMatcher for c.NextBlock() { switch c.Val() { case "if": args1 := c.RemainingArgs() if len(args1) != 3 { return matcher, c.ArgErr() } ifc, err := newIfCond(args1[0], args1[1], args1[2]) if err != nil { return matcher, err } matcher.ifs = append(matcher.ifs, ifc) case "if_op": if !c.NextArg() { return matcher, c.ArgErr() } switch c.Val() { case "and": matcher.isOr = false case "or": matcher.isOr = true default: return matcher, c.ArgErr() } } } return matcher, nil }
// NewStaticUpstreams parses the configuration input and sets up // static upstreams for the proxy middleware. func NewStaticUpstreams(c caddyfile.Dispenser) ([]Upstream, error) { var upstreams []Upstream for c.Next() { upstream := &staticUpstream{ from: "", upstreamHeaders: make(http.Header), downstreamHeaders: make(http.Header), Hosts: nil, Policy: &Random{}, MaxFails: 1, TryInterval: 250 * time.Millisecond, MaxConns: 0, KeepAlive: http.DefaultMaxIdleConnsPerHost, } if !c.Args(&upstream.from) { return upstreams, c.ArgErr() } var to []string for _, t := range c.RemainingArgs() { parsed, err := parseUpstream(t) if err != nil { return upstreams, err } to = append(to, parsed...) } for c.NextBlock() { switch c.Val() { case "upstream": if !c.NextArg() { return upstreams, c.ArgErr() } parsed, err := parseUpstream(c.Val()) if err != nil { return upstreams, err } to = append(to, parsed...) default: if err := parseBlock(&c, upstream); err != nil { return upstreams, err } } } if len(to) == 0 { return upstreams, c.ArgErr() } upstream.Hosts = make([]*UpstreamHost, len(to)) for i, host := range to { uh, err := upstream.NewHost(host) if err != nil { return upstreams, err } upstream.Hosts[i] = uh } if upstream.HealthCheck.Path != "" { upstream.HealthCheck.Client = http.Client{ Timeout: upstream.HealthCheck.Timeout, } go upstream.HealthCheckWorker(nil) } upstreams = append(upstreams, upstream) } return upstreams, nil }