Compare commits
No commits in common. "22947db2b6ae17c6069b466d05533a3407e23aec" and "e2e3799bc37284472a6020b528bf5a346dd070a0" have entirely different histories.
22947db2b6
...
e2e3799bc3
|
@ -4,19 +4,8 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
|
||||||
"git.xdrm.io/go/aicra/internal/cerr"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// ErrUnknownType is returned when encountering an unknown type
|
|
||||||
const ErrUnknownType = cerr.Error("unknown type")
|
|
||||||
|
|
||||||
// ErrInvalidJSON is returned when json parse failed
|
|
||||||
const ErrInvalidJSON = cerr.Error("invalid json")
|
|
||||||
|
|
||||||
// ErrInvalidRootType is returned when json is a map
|
|
||||||
const ErrInvalidRootType = cerr.Error("invalid json root type")
|
|
||||||
|
|
||||||
// Parameter represents an http request parameter
|
// Parameter represents an http request parameter
|
||||||
// that can be of type URL, GET, or FORM (multipart, json, urlencoded)
|
// that can be of type URL, GET, or FORM (multipart, json, urlencoded)
|
||||||
type Parameter struct {
|
type Parameter struct {
|
||||||
|
@ -33,23 +22,16 @@ type Parameter struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse parameter (json-like) if not already done
|
// Parse parameter (json-like) if not already done
|
||||||
func (i *Parameter) Parse() error {
|
func (i *Parameter) Parse() {
|
||||||
|
|
||||||
/* (1) Stop if already parsed or nil*/
|
/* (1) Stop if already parsed or nil*/
|
||||||
if i.Parsed || i.Value == nil {
|
if i.Parsed || i.Value == nil {
|
||||||
return nil
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (2) Try to parse value */
|
/* (2) Try to parse value */
|
||||||
parsed, err := parseParameter(i.Value)
|
i.Value = parseParameter(i.Value)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
i.Parsed = true
|
|
||||||
i.Value = parsed
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// parseParameter parses http GET/POST data
|
// parseParameter parses http GET/POST data
|
||||||
|
@ -57,7 +39,7 @@ func (i *Parameter) Parse() error {
|
||||||
// - size = 1 : return json of first element
|
// - size = 1 : return json of first element
|
||||||
// - size > 1 : return array of json elements
|
// - size > 1 : return array of json elements
|
||||||
// - string : return json if valid, else return raw string
|
// - string : return json if valid, else return raw string
|
||||||
func parseParameter(data interface{}) (interface{}, error) {
|
func parseParameter(data interface{}) interface{} {
|
||||||
dtype := reflect.TypeOf(data)
|
dtype := reflect.TypeOf(data)
|
||||||
dvalue := reflect.ValueOf(data)
|
dvalue := reflect.ValueOf(data)
|
||||||
|
|
||||||
|
@ -68,21 +50,17 @@ func parseParameter(data interface{}) (interface{}, error) {
|
||||||
|
|
||||||
// 1. Return nothing if empty
|
// 1. Return nothing if empty
|
||||||
if dvalue.Len() == 0 {
|
if dvalue.Len() == 0 {
|
||||||
return data, nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. only return first element if alone
|
// 2. only return first element if alone
|
||||||
if dvalue.Len() == 1 {
|
if dvalue.Len() == 1 {
|
||||||
|
|
||||||
element := dvalue.Index(0)
|
element := dvalue.Index(0)
|
||||||
|
if element.Kind() != reflect.String {
|
||||||
// try to parse if a string (containing json)
|
return nil
|
||||||
if element.Kind() == reflect.String {
|
|
||||||
return parseParameter(element.String())
|
|
||||||
}
|
}
|
||||||
|
return parseParameter(element.String())
|
||||||
// already typed
|
|
||||||
return data, nil
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,17 +72,12 @@ func parseParameter(data interface{}) (interface{}, error) {
|
||||||
|
|
||||||
// ignore non-string
|
// ignore non-string
|
||||||
if element.Kind() != reflect.String {
|
if element.Kind() != reflect.String {
|
||||||
result[i] = nil
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
parsed, err := parseParameter(element.String())
|
result[i] = parseParameter(element.String())
|
||||||
if err != nil {
|
|
||||||
return data, err
|
|
||||||
}
|
}
|
||||||
result[i] = parsed
|
return result
|
||||||
}
|
|
||||||
return result, nil
|
|
||||||
|
|
||||||
/* (2) string -> parse */
|
/* (2) string -> parse */
|
||||||
case reflect.String:
|
case reflect.String:
|
||||||
|
@ -121,23 +94,23 @@ func parseParameter(data interface{}) (interface{}, error) {
|
||||||
|
|
||||||
mapval, ok := result.(map[string]interface{})
|
mapval, ok := result.(map[string]interface{})
|
||||||
if !ok {
|
if !ok {
|
||||||
return dvalue.String(), ErrInvalidRootType
|
return dvalue.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
wrapped, ok := mapval["wrapped"]
|
wrapped, ok := mapval["wrapped"]
|
||||||
if !ok {
|
if !ok {
|
||||||
return dvalue.String(), ErrInvalidJSON
|
return dvalue.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
return wrapped, nil
|
return wrapped
|
||||||
}
|
}
|
||||||
|
|
||||||
// else return as string
|
// else return as string
|
||||||
return dvalue.String(), nil
|
return dvalue.String()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (3) NIL if unknown type */
|
/* (3) NIL if unknown type */
|
||||||
return dvalue, ErrUnknownType
|
return dvalue
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue