From 2d2e02b3a0048eb7cde71cfdaf1a270cc83bb884 Mon Sep 17 00:00:00 2001 From: Vivek Patel Date: Thu, 30 Sep 2021 15:21:32 +0530 Subject: [PATCH] Fixes apigw prefilter for string with hyphen --- pkg/apigw/filter/prefilter.go | 14 ++++++++++---- pkg/apigw/filter/prefilter_test.go | 15 ++++++++++----- tests/apigw/prefilter_header_failing_test.go | 8 ++++++++ tests/apigw/prefilter_header_passing_test.go | 8 ++++++++ tests/apigw/prefilter_query_failing_test.go | 8 ++++++++ tests/apigw/prefilter_query_passing_test.go | 8 ++++++++ .../testdata/prefilter_header_failing/def.yaml | 9 +++++++++ .../testdata/prefilter_header_passing/def.yaml | 9 +++++++++ .../testdata/prefilter_query_failing/def.yaml | 10 ++++++++++ .../testdata/prefilter_query_passing/def.yaml | 9 +++++++++ 10 files changed, 89 insertions(+), 9 deletions(-) diff --git a/pkg/apigw/filter/prefilter.go b/pkg/apigw/filter/prefilter.go index bdd93e388..8370ff41b 100644 --- a/pkg/apigw/filter/prefilter.go +++ b/pkg/apigw/filter/prefilter.go @@ -100,13 +100,16 @@ func (h header) Handler() types.HandlerFunc { // get the request data and put it into vars out, err := expr.NewVars(vv) - if err != nil { return pe.Internal("could not validate headers: %v", err) } - b, err := h.eval.Test(ctx, out) + err = out.Set("headers", vv) + if err != nil { + return pe.Internal("could not set headers: %v", err) + } + b, err := h.eval.Test(ctx, out) if err != nil { return pe.InvalidData("could not validate headers: %v", err) } @@ -181,13 +184,16 @@ func (qp *queryParam) Handler() types.HandlerFunc { // get the request data and put it into vars out, err := expr.NewVars(vv) - if err != nil { return pe.Internal("could not validate query parameters: %v", err) } - b, err := qp.eval.Test(ctx, out) + err = out.Set("params", vv) + if err != nil { + return pe.Internal("could not set params: %v", err) + } + b, err := qp.eval.Test(ctx, out) if err != nil { return pe.InvalidData("could not validate query parameters: %v", err) } diff --git a/pkg/apigw/filter/prefilter_test.go b/pkg/apigw/filter/prefilter_test.go index 2a81f22df..97d4920d3 100644 --- a/pkg/apigw/filter/prefilter_test.go +++ b/pkg/apigw/filter/prefilter_test.go @@ -67,11 +67,11 @@ func Test_headerHandle(t *testing.T) { expr: `{"expr":"match(Foo, \"^b\\\\wr\\\\s.*$\")"}`, headers: map[string][]string{"Foo": {"bar "}}, }, - // { - // name: "matching header with hyphen - TODO", - // expr: `{"expr":"Content-type == \"application/json\""}`, - // headers: map[string][]string{"Content-type": {"application/json"}}, - // }, + { + name: "matching header with hyphen", + expr: `{"expr":"headers[\"Content-type\"] == \"application/json\""}`, + headers: map[string][]string{"Content-type": {"application/json"}}, + }, } ) @@ -134,6 +134,11 @@ func Test_queryParamHandle(t *testing.T) { expr: `{"expr":"foo == \"bar-baz\""}`, url: "https://examp.le?foo=bar-baz", }, + { + name: "matching query parameter", + expr: `{"expr":"params[\"foo-bar\"] == \"bar-baz\""}`, + url: "https://examp.le?foo-bar=bar-baz", + }, } ) diff --git a/tests/apigw/prefilter_header_failing_test.go b/tests/apigw/prefilter_header_failing_test.go index fe9a578a7..4ac8dcc63 100644 --- a/tests/apigw/prefilter_header_failing_test.go +++ b/tests/apigw/prefilter_header_failing_test.go @@ -17,4 +17,12 @@ func Test_prefilter_header_failing(t *testing.T) { Expect(t). Status(http.StatusBadRequest). End() + + h.apiInit(). + Get("/test-hyphen"). + Header("Accept-Language", "fr-CH, fr;q=0.9"). + Header("Token", "brute-force-guess"). + Expect(t). + Status(http.StatusBadRequest). + End() } diff --git a/tests/apigw/prefilter_header_passing_test.go b/tests/apigw/prefilter_header_passing_test.go index 1111e3fcf..a93b048e5 100644 --- a/tests/apigw/prefilter_header_passing_test.go +++ b/tests/apigw/prefilter_header_passing_test.go @@ -17,4 +17,12 @@ func Test_prefilter_header_passing(t *testing.T) { Expect(t). Status(http.StatusOK). End() + + h.apiInit(). + Get("/test-hyphen"). + Header("Accept-Language", "fr-CH, fr;q=0.9"). + Header("Token", "super-secret-token"). + Expect(t). + Status(http.StatusOK). + End() } diff --git a/tests/apigw/prefilter_query_failing_test.go b/tests/apigw/prefilter_query_failing_test.go index 1b1a60922..7ac1d9418 100644 --- a/tests/apigw/prefilter_query_failing_test.go +++ b/tests/apigw/prefilter_query_failing_test.go @@ -17,4 +17,12 @@ func Test_prefilter_query_failing(t *testing.T) { Expect(t). Status(http.StatusBadRequest). End() + + h.apiInit(). + Get("/test-hyphen"). + Query("foo-bar", "encrypted-string"). + Header("Accept", "application/json"). + Expect(t). + Status(http.StatusBadRequest). + End() } diff --git a/tests/apigw/prefilter_query_passing_test.go b/tests/apigw/prefilter_query_passing_test.go index 532d0ac46..d84913468 100644 --- a/tests/apigw/prefilter_query_passing_test.go +++ b/tests/apigw/prefilter_query_passing_test.go @@ -17,4 +17,12 @@ func Test_prefilter_query_passing(t *testing.T) { Expect(t). Status(http.StatusOK). End() + + h.apiInit(). + Get("/test-hyphen"). + Query("foo-bar", "encrypted-string"). + Header("Accept", "application/json"). + Expect(t). + Status(http.StatusOK). + End() } diff --git a/tests/apigw/testdata/prefilter_header_failing/def.yaml b/tests/apigw/testdata/prefilter_header_failing/def.yaml index e8b48a415..d911ac534 100644 --- a/tests/apigw/testdata/prefilter_header_failing/def.yaml +++ b/tests/apigw/testdata/prefilter_header_failing/def.yaml @@ -7,3 +7,12 @@ apigateway: kind: "prefilter" params: expr: "Token == \"super-secret-token\"" + + - endpoint: /test-hyphen + method: GET + enabled: true + filters: + - ref: "header" + kind: "prefilter" + params: + expr: "Accept-Language == \"fr-CH, fr;q=0.9\"" diff --git a/tests/apigw/testdata/prefilter_header_passing/def.yaml b/tests/apigw/testdata/prefilter_header_passing/def.yaml index e8b48a415..13ff1506e 100644 --- a/tests/apigw/testdata/prefilter_header_passing/def.yaml +++ b/tests/apigw/testdata/prefilter_header_passing/def.yaml @@ -7,3 +7,12 @@ apigateway: kind: "prefilter" params: expr: "Token == \"super-secret-token\"" + + - endpoint: /test-hyphen + method: GET + enabled: true + filters: + - ref: "header" + kind: "prefilter" + params: + expr: "headers[\"Accept-Language\"] == \"fr-CH, fr;q=0.9\"" diff --git a/tests/apigw/testdata/prefilter_query_failing/def.yaml b/tests/apigw/testdata/prefilter_query_failing/def.yaml index f8e965013..709d8860a 100644 --- a/tests/apigw/testdata/prefilter_query_failing/def.yaml +++ b/tests/apigw/testdata/prefilter_query_failing/def.yaml @@ -7,3 +7,13 @@ apigateway: kind: "prefilter" params: expr: "token == \"super-secret-token\"" + + - endpoint: /test-hyphen + method: GET + enabled: true + filters: + - ref: "queryParam" + kind: "prefilter" + params: + expr: "foo-bar == \"encrypted-string\"" + diff --git a/tests/apigw/testdata/prefilter_query_passing/def.yaml b/tests/apigw/testdata/prefilter_query_passing/def.yaml index f8e965013..6c021e48c 100644 --- a/tests/apigw/testdata/prefilter_query_passing/def.yaml +++ b/tests/apigw/testdata/prefilter_query_passing/def.yaml @@ -7,3 +7,12 @@ apigateway: kind: "prefilter" params: expr: "token == \"super-secret-token\"" + + - endpoint: /test-hyphen + method: GET + enabled: true + filters: + - ref: "queryParam" + kind: "prefilter" + params: + expr: "params[\"foo-bar\"] == \"encrypted-string\""