func Example() { // create a data client: dataClient := testdataclient.New([]*eskip.Route{ {Path: "/some/path", Backend: "https://www.example.org"}}) // (only in tests) tl := loggingtest.New() defer tl.Close() // create a router: r := routing.New(routing.Options{ DataClients: []routing.DataClient{dataClient}, Log: tl}) defer r.Close() // wait for the route data being propagated: tl.WaitFor("route settigns applied", time.Second) // test the router: route, _ := r.Route(&http.Request{URL: &url.URL{Path: "/some/path"}}) if route == nil { log.Fatal("failed to route request") } fmt.Println(route.Backend) // Output: // https://www.example.org }
func newTestRoutingWithFiltersPredicates(fr filters.Registry, cps []routing.PredicateSpec, dc ...routing.DataClient) (*testRouting, error) { tl := loggingtest.New() rt := routing.New(routing.Options{ FilterRegistry: fr, Predicates: cps, DataClients: dc, PollTimeout: pollTimeout, Log: tl}) tr := &testRouting{tl, rt} return tr, tr.waitForNRouteSettings(len(dc)) }
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} }
func newTestProxyWithFilters(fr filters.Registry, doc string, flags Flags, pr ...PriorityRoute) (*testProxy, error) { dc, err := testdataclient.NewDoc(doc) if err != nil { return nil, err } tl := loggingtest.New() rt := routing.New(routing.Options{ FilterRegistry: fr, PollTimeout: sourcePollTimeout, DataClients: []routing.DataClient{dc}, Log: tl}) p := WithParams(Params{Routing: rt, Flags: flags, PriorityRoutes: pr}) if err := tl.WaitFor("route settings applied", time.Second); err != nil { return nil, err } return &testProxy{tl, rt, p}, nil }
func TestRedirect(t *testing.T) { for _, ti := range []struct { msg string code int filterLocation string checkLocation string }{{ "schema only", http.StatusFound, "http:", "http://incoming.example.org/some/path?foo=1&bar=2", }, { "schema and host", http.StatusFound, "http://redirect.example.org", "http://redirect.example.org/some/path?foo=1&bar=2", }, { "schema, host and path", http.StatusFound, "http://redirect.example.org/some/other/path", "http://redirect.example.org/some/other/path?foo=1&bar=2", }, { "schema, host, path and query", http.StatusFound, "http://redirect.example.org/some/other/path?newquery=3", "http://redirect.example.org/some/other/path?newquery=3", }, { "host only", http.StatusFound, "//redirect.example.org", "https://redirect.example.org/some/path?foo=1&bar=2", }, { "host and path", http.StatusFound, "//redirect.example.org/some/other/path", "https://redirect.example.org/some/other/path?foo=1&bar=2", }, { "host, path and query", http.StatusFound, "//redirect.example.org/some/other/path?newquery=3", "https://redirect.example.org/some/other/path?newquery=3", }, { "path only", http.StatusFound, "/some/other/path", "https://incoming.example.org/some/other/path?foo=1&bar=2", }, { "path and query", http.StatusFound, "/some/other/path?newquery=3", "https://incoming.example.org/some/other/path?newquery=3", }, { "query only", http.StatusFound, "?newquery=3", "https://incoming.example.org/some/path?newquery=3", }, { "schema and path", http.StatusFound, "http:///some/other/path", "http://incoming.example.org/some/other/path?foo=1&bar=2", }, { "schema, path and query", http.StatusFound, "http:///some/other/path?newquery=3", "http://incoming.example.org/some/other/path?newquery=3", }, { "schema and query", http.StatusFound, "http://?newquery=3", "http://incoming.example.org/some/path?newquery=3", }, { "different code", http.StatusMovedPermanently, "/some/path", "https://incoming.example.org/some/path?foo=1&bar=2", }} { for _, tii := range []struct { msg string name string }{{ "deprecated", RedirectName, }, { "not deprecated", RedirectToName, }} { dc := testdataclient.New([]*eskip.Route{{ Shunt: true, Filters: []*eskip.Filter{{ Name: tii.name, Args: []interface{}{float64(ti.code), ti.filterLocation}}}}}) tl := loggingtest.New() rt := routing.New(routing.Options{ FilterRegistry: MakeRegistry(), DataClients: []routing.DataClient{dc}, Log: tl}) p := proxy.New(rt, proxy.OptionsNone) closeAll := func() { p.Close() rt.Close() tl.Close() } // pick up routing if err := tl.WaitFor("route settings applied", time.Second); err != nil { t.Error(err) closeAll() continue } req := &http.Request{ URL: &url.URL{Path: "/some/path", RawQuery: "foo=1&bar=2"}, Host: "incoming.example.org"} w := httptest.NewRecorder() p.ServeHTTP(w, req) if w.Code != ti.code { t.Error(ti.msg, tii.msg, "invalid status code", w.Code) } if w.Header().Get("Location") != ti.checkLocation { t.Error(ti.msg, tii.msg, "invalid location", w.Header().Get("Location")) } closeAll() } } }