From 848c356144f210a49fd96682a0b3c0c834fc631c Mon Sep 17 00:00:00 2001 From: Steve Ramage Date: Sat, 17 Feb 2024 15:53:46 -0800 Subject: [PATCH] Resolves #32 - Add support for URL Encoded filters --- external/epsearchast/v3/ast.go | 18 ++++++++++++++++-- external/epsearchast/v3/ast_test.go | 19 +++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/external/epsearchast/v3/ast.go b/external/epsearchast/v3/ast.go index 26ccae3..a7d88a3 100644 --- a/external/epsearchast/v3/ast.go +++ b/external/epsearchast/v3/ast.go @@ -4,6 +4,7 @@ package epsearchast_v3 import ( "encoding/json" "fmt" + "net/url" "strings" ) @@ -21,8 +22,21 @@ func GetAst(jsonTxt string) (*AstNode, error) { err := json.Unmarshal([]byte(jsonTxt), astNode) if err != nil { - return nil, fmt.Errorf("could not parse filter:%w", err) - } else if err := astNode.checkValid(); err != nil { + // url decode jsonTxt + decoded, urlDecodingError := url.QueryUnescape(jsonTxt) + + if urlDecodingError == nil { + urlDecodingError = json.Unmarshal([]byte(decoded), astNode) + + if urlDecodingError != nil { + return nil, fmt.Errorf("could not parse filter:%w, error parsing decoded filter: %v", err, urlDecodingError) + } + } else { + return nil, fmt.Errorf("could not parse filter:%w, error decoding: %v", err, urlDecodingError) + } + } + + if err := astNode.checkValid(); err != nil { return nil, fmt.Errorf("error validating filter:%w", err) } else { return astNode, nil diff --git a/external/epsearchast/v3/ast_test.go b/external/epsearchast/v3/ast_test.go index b8d3270..26093d5 100644 --- a/external/epsearchast/v3/ast_test.go +++ b/external/epsearchast/v3/ast_test.go @@ -2,6 +2,7 @@ package epsearchast_v3 import ( "github.com/stretchr/testify/require" + "net/url" "testing" ) @@ -283,3 +284,21 @@ func TestAndReturnsErrorWithAnInvalidChild(t *testing.T) { require.ErrorContains(t, err, "unknown operator FOO") require.Nil(t, astNode) } + +func TestValidObjectThatIsUrlEncodedReturnsAst(t *testing.T) { + // Fixture Setup + // language=JSON + jsonTxt := ` +{ + "type": "EQ", + "args": [ "status", "paid"] +} +` + // Execute SUT + astNode, err := GetAst(url.QueryEscape(jsonTxt)) + + // Verify + require.NoError(t, err) + require.NotNil(t, astNode) +} +