func WithParams(fr filters.Registry, o proxy.Params, routes ...*eskip.Route) *TestProxy { dc := testdataclient.New(routes) tl := loggingtest.New() rt := routing.New(routing.Options{FilterRegistry: fr, DataClients: []routing.DataClient{dc}, Log: tl}) o.Routing = rt pr := proxy.WithParams(o) tsp := httptest.NewServer(pr) if err := tl.WaitFor("route settings applied", 3*time.Second); err != nil { panic(err) } return &TestProxy{ URL: tsp.URL, log: tl, routing: rt, proxy: pr, server: tsp} }
// Run skipper. func Run(o Options) error { // init log err := initLog(o) if err != nil { return err } // init metrics metrics.Init(metrics.Options{ Listener: o.MetricsListener, Prefix: o.MetricsPrefix, EnableDebugGcMetrics: o.EnableDebugGcMetrics, EnableRuntimeMetrics: o.EnableRuntimeMetrics, EnableServeRouteMetrics: o.EnableServeRouteMetrics, EnableServeHostMetrics: o.EnableServeHostMetrics, }) // create authentication for Innkeeper auth := innkeeper.CreateInnkeeperAuthentication(innkeeper.AuthOptions{ InnkeeperAuthToken: o.InnkeeperAuthToken, OAuthCredentialsDir: o.OAuthCredentialsDir, OAuthUrl: o.OAuthUrl, OAuthScope: o.OAuthScope}) // create data clients dataClients, err := createDataClients(o, auth) if err != nil { return err } // append custom data clients dataClients = append(dataClients, o.CustomDataClients...) if len(dataClients) == 0 { log.Warning("no route source specified") } // create a filter registry with the available filter specs registered, // and register the custom filters registry := builtin.MakeRegistry() for _, f := range o.CustomFilters { registry.Register(f) } // create routing // create the proxy instance var mo routing.MatchingOptions if o.IgnoreTrailingSlash { mo = routing.IgnoreTrailingSlash } // ensure a non-zero poll timeout if o.SourcePollTimeout <= 0 { o.SourcePollTimeout = defaultSourcePollTimeout } // check for dev mode, and set update buffer of the routes updateBuffer := defaultRoutingUpdateBuffer if o.DevMode { updateBuffer = 0 } // include bundeled custom predicates o.CustomPredicates = append(o.CustomPredicates, source.New(), interval.NewBetween(), interval.NewBefore(), interval.NewAfter(), cookie.New(), query.New()) // create a routing engine routing := routing.New(routing.Options{ FilterRegistry: registry, MatchingOptions: mo, PollTimeout: o.SourcePollTimeout, DataClients: dataClients, Predicates: o.CustomPredicates, UpdateBuffer: updateBuffer}) defer routing.Close() proxyFlags := proxy.Flags(o.ProxyOptions) | o.ProxyFlags proxyParams := proxy.Params{ Routing: routing, Flags: proxyFlags, PriorityRoutes: o.PriorityRoutes, IdleConnectionsPerHost: o.IdleConnectionsPerHost, CloseIdleConnsPeriod: o.CloseIdleConnsPeriod, FlushInterval: o.BackendFlushInterval, ExperimentalUpgrade: o.ExperimentalUpgrade} if o.DebugListener != "" { do := proxyParams do.Flags |= proxy.Debug dbg := proxy.WithParams(do) log.Infof("debug listener on %v", o.DebugListener) go func() { http.ListenAndServe(o.DebugListener, dbg) }() } // create the proxy proxy := proxy.WithParams(proxyParams) defer proxy.Close() return listenAndServe(proxy, &o) }