@@ -2632,6 +2632,104 @@ func TestAllowedRequest(t *testing.T) {
26322632 }
26332633}
26342634
2635+func TestAllowedRequestWithForwardedUriHeader(t *testing.T) {
2636+ upstreamServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
2637+ w.WriteHeader(200)
2638+ }))
2639+ t.Cleanup(upstreamServer.Close)
2640+
2641+ opts := baseTestOptions()
2642+ opts.ReverseProxy = true
2643+ opts.UpstreamServers = options.UpstreamConfig{
2644+ Upstreams: []options.Upstream{
2645+ {
2646+ ID: upstreamServer.URL,
2647+ Path: "/",
2648+ URI: upstreamServer.URL,
2649+ },
2650+ },
2651+ }
2652+ opts.SkipAuthRegex = []string{
2653+ "^/skip/auth/regex$",
2654+ }
2655+ opts.SkipAuthRoutes = []string{
2656+ "GET=^/skip/auth/routes/get",
2657+ }
2658+ err := validation.Validate(opts)
2659+ assert.NoError(t, err)
2660+ proxy, err := NewOAuthProxy(opts, func(_ string) bool { return true })
2661+ if err != nil {
2662+ t.Fatal(err)
2663+ }
2664+
2665+ testCases := []struct {
2666+ name string
2667+ method string
2668+ url string
2669+ allowed bool
2670+ }{
2671+ {
2672+ name: "Regex GET allowed",
2673+ method: "GET",
2674+ url: "/skip/auth/regex",
2675+ allowed: true,
2676+ },
2677+ {
2678+ name: "Regex POST allowed ",
2679+ method: "POST",
2680+ url: "/skip/auth/regex",
2681+ allowed: true,
2682+ },
2683+ {
2684+ name: "Regex denied",
2685+ method: "GET",
2686+ url: "/wrong/denied",
2687+ allowed: false,
2688+ },
2689+ {
2690+ name: "Route allowed",
2691+ method: "GET",
2692+ url: "/skip/auth/routes/get",
2693+ allowed: true,
2694+ },
2695+ {
2696+ name: "Route denied with wrong method",
2697+ method: "PATCH",
2698+ url: "/skip/auth/routes/get",
2699+ allowed: false,
2700+ },
2701+ {
2702+ name: "Route denied with wrong path",
2703+ method: "GET",
2704+ url: "/skip/auth/routes/wrong/path",
2705+ allowed: false,
2706+ },
2707+ {
2708+ name: "Route denied with wrong path and method",
2709+ method: "POST",
2710+ url: "/skip/auth/routes/wrong/path",
2711+ allowed: false,
2712+ },
2713+ }
2714+
2715+ for _, tc := range testCases {
2716+ t.Run(tc.name, func(t *testing.T) {
2717+ req, err := http.NewRequest(tc.method, opts.ProxyPrefix+authOnlyPath, nil)
2718+ req.Header.Set("X-Forwarded-Uri", tc.url)
2719+ assert.NoError(t, err)
2720+
2721+ rw := httptest.NewRecorder()
2722+ proxy.ServeHTTP(rw, req)
2723+
2724+ if tc.allowed {
2725+ assert.Equal(t, 202, rw.Code)
2726+ } else {
2727+ assert.Equal(t, 401, rw.Code)
2728+ }
2729+ })
2730+ }
2731+}
2732+
26352733func TestAllowedRequestNegateWithoutMethod(t *testing.T) {
26362734 upstreamServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
26372735 w.WriteHeader(200)