diff --git a/internal/reqdata/parameter.go b/internal/reqdata/parameter.go index d7b5648..3f7087f 100644 --- a/internal/reqdata/parameter.go +++ b/internal/reqdata/parameter.go @@ -22,31 +22,22 @@ type Parameter struct { } // Parse parameter (json-like) if not already done -func (i *Parameter) Parse() error { +func (i *Parameter) Parse() { - /* (1) Stop if already parsed or nil*/ + /* ignore already parsed or nil*/ if i.Parsed || i.Value == nil { - return nil - } - - /* (2) Try to parse value */ - parsed, err := parseParameter(i.Value) - if err != nil { - return err + return } + /* parse value */ i.Parsed = true - i.Value = parsed - - return nil + i.Value = parseParameter(i.Value) } -// parseParameter parses http GET/POST data -// - []string -// - size = 1 : return json of first element -// - size > 1 : return array of json elements -// - string : return json if valid, else return raw string -func parseParameter(data interface{}) (interface{}, error) { +// parseParameter parses http URI/GET/POST data +// - []string : return array of json elements +// - string : return json if valid, else return raw string +func parseParameter(data interface{}) interface{} { dtype := reflect.TypeOf(data) dvalue := reflect.ValueOf(data) @@ -57,7 +48,7 @@ func parseParameter(data interface{}) (interface{}, error) { // 1. ignore empty if dvalue.Len() == 0 { - return data, nil + return data } // 2. parse each element recursively @@ -65,20 +56,9 @@ func parseParameter(data interface{}) (interface{}, error) { for i, l := 0, dvalue.Len(); i < l; i++ { element := dvalue.Index(i) - - // ignore non-string - if element.Kind() != reflect.String { - result[i] = element.Interface() - continue - } - - parsed, err := parseParameter(element.String()) - if err != nil { - return data, err - } - result[i] = parsed + result[i] = parseParameter(element.Interface()) } - return result, nil + return result /* (2) string -> parse */ case reflect.String: @@ -91,27 +71,25 @@ func parseParameter(data interface{}) (interface{}, error) { err := json.Unmarshal([]byte(wrapper), &result) // return if success - if err == nil { - - mapval, ok := result.(map[string]interface{}) - if !ok { - return dvalue.String(), ErrInvalidRootType - } - - wrapped, ok := mapval["wrapped"] - if !ok { - return dvalue.String(), ErrInvalidJSON - } - - return wrapped, nil + if err != nil { + return dvalue.String() } - // else return as string - return dvalue.String(), nil + mapval, ok := result.(map[string]interface{}) + if !ok { + return dvalue.String() + } + + wrapped, ok := mapval["wrapped"] + if !ok { + return dvalue.String() + } + + return wrapped } /* (3) NIL if unknown type */ - return dvalue.Interface(), nil + return dvalue.Interface() } diff --git a/internal/reqdata/parameter_test.go b/internal/reqdata/parameter_test.go index 29bcbec..fc7a94d 100644 --- a/internal/reqdata/parameter_test.go +++ b/internal/reqdata/parameter_test.go @@ -6,14 +6,8 @@ import ( ) func TestSimpleString(t *testing.T) { - p := Parameter{Parsed: false, File: false, Value: "some-string"} - - err := p.Parse() - - if err != nil { - t.Errorf("unexpected error: <%s>", err) - t.FailNow() - } + p := Parameter{Value: "some-string"} + p.Parse() if !p.Parsed { t.Errorf("expected parameter to be parsed") @@ -38,11 +32,7 @@ func TestSimpleFloat(t *testing.T) { for i, tcase := range tcases { t.Run("case "+string(i), func(t *testing.T) { p := Parameter{Parsed: false, File: false, Value: tcase} - - if err := p.Parse(); err != nil { - t.Errorf("unexpected error: <%s>", err) - t.FailNow() - } + p.Parse() if !p.Parsed { t.Errorf("expected parameter to be parsed") @@ -70,10 +60,7 @@ func TestSimpleBool(t *testing.T) { t.Run("case "+string(i), func(t *testing.T) { p := Parameter{Parsed: false, File: false, Value: tcase} - if err := p.Parse(); err != nil { - t.Errorf("unexpected error: <%s>", err) - t.FailNow() - } + p.Parse() if !p.Parsed { t.Errorf("expected parameter to be parsed") @@ -96,13 +83,7 @@ func TestSimpleBool(t *testing.T) { func TestJsonStringSlice(t *testing.T) { p := Parameter{Parsed: false, File: false, Value: `["str1", "str2"]`} - - err := p.Parse() - - if err != nil { - t.Errorf("unexpected error: <%s>", err) - t.FailNow() - } + p.Parse() if !p.Parsed { t.Errorf("expected parameter to be parsed") @@ -140,13 +121,7 @@ func TestJsonStringSlice(t *testing.T) { func TestStringSlice(t *testing.T) { p := Parameter{Parsed: false, File: false, Value: []string{"str1", "str2"}} - - err := p.Parse() - - if err != nil { - t.Errorf("unexpected error: <%s>", err) - t.FailNow() - } + p.Parse() if !p.Parsed { t.Errorf("expected parameter to be parsed") @@ -194,12 +169,7 @@ func TestJsonPrimitiveBool(t *testing.T) { for i, tcase := range tcases { t.Run("case "+string(i), func(t *testing.T) { p := Parameter{Parsed: false, File: false, Value: tcase.Raw} - - err := p.Parse() - if err != nil { - t.Errorf("unexpected error: <%s>", err) - t.FailNow() - } + p.Parse() if !p.Parsed { t.Errorf("expected parameter to be parsed") @@ -242,12 +212,7 @@ func TestJsonPrimitiveFloat(t *testing.T) { for i, tcase := range tcases { t.Run("case "+string(i), func(t *testing.T) { p := Parameter{Parsed: false, File: false, Value: tcase.Raw} - - err := p.Parse() - if err != nil { - t.Errorf("unexpected error: <%s>", err) - t.FailNow() - } + p.Parse() if !p.Parsed { t.Errorf("expected parameter to be parsed") @@ -271,13 +236,7 @@ func TestJsonPrimitiveFloat(t *testing.T) { func TestJsonBoolSlice(t *testing.T) { p := Parameter{Parsed: false, File: false, Value: []string{"true", "false"}} - - err := p.Parse() - - if err != nil { - t.Errorf("unexpected error: <%s>", err) - t.FailNow() - } + p.Parse() if !p.Parsed { t.Errorf("expected parameter to be parsed") @@ -315,13 +274,7 @@ func TestJsonBoolSlice(t *testing.T) { func TestBoolSlice(t *testing.T) { p := Parameter{Parsed: false, File: false, Value: []bool{true, false}} - - err := p.Parse() - - if err != nil { - t.Errorf("unexpected error: <%s>", err) - t.FailNow() - } + p.Parse() if !p.Parsed { t.Errorf("expected parameter to be parsed")