diff options
author | Jhon Honce <jhonce@redhat.com> | 2020-01-23 16:13:47 -0700 |
---|---|---|
committer | Jhon Honce <jhonce@redhat.com> | 2020-01-23 16:32:00 -0700 |
commit | 9634e7eef77abbba2584b8e78daf9c76cfdcedd9 (patch) | |
tree | 61731b20c17e12b2c342ec910e28072029d2ecae /pkg/api/handlers/decoder.go | |
parent | 8beeb067aac857deb29e91562cf4b6f068fe0328 (diff) | |
download | podman-9634e7eef77abbba2584b8e78daf9c76cfdcedd9.tar.gz podman-9634e7eef77abbba2584b8e78daf9c76cfdcedd9.tar.bz2 podman-9634e7eef77abbba2584b8e78daf9c76cfdcedd9.zip |
Add query parameter converters for complex types
* Add converter for URL query parameters of type map[string][]string
* Add converter for URL query parameters of type time.Time
* Added function to allocate and configure schema.Decoder for API use
* Updated API handlers to leverage new converters, and correct handler
code for filter type
An encoding example for a client using filters:
v := map[string][]string{
"dangling": {"true"},
}
payload, err := jsoniter.MarshalToString(v)
if err != nil {
panic(err)
}
payload = "?filters=" + url.QueryEscape(payload)
Signed-off-by: Jhon Honce <jhonce@redhat.com>
Diffstat (limited to 'pkg/api/handlers/decoder.go')
-rw-r--r-- | pkg/api/handlers/decoder.go | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/pkg/api/handlers/decoder.go b/pkg/api/handlers/decoder.go new file mode 100644 index 000000000..d87409394 --- /dev/null +++ b/pkg/api/handlers/decoder.go @@ -0,0 +1,50 @@ +package handlers + +import ( + "encoding/json" + "reflect" + "time" + + "github.com/gorilla/schema" + "github.com/sirupsen/logrus" +) + +// NewAPIDecoder returns a configured schema.Decoder +func NewAPIDecoder() *schema.Decoder { + d := schema.NewDecoder() + d.IgnoreUnknownKeys(true) + d.RegisterConverter(map[string][]string{}, convertUrlValuesString) + d.RegisterConverter(time.Time{}, convertTimeString) + return d +} + +// On client: +// v := map[string][]string{ +// "dangling": {"true"}, +// } +// +// payload, err := jsoniter.MarshalToString(v) +// if err != nil { +// panic(err) +// } +// payload = url.QueryEscape(payload) +func convertUrlValuesString(query string) reflect.Value { + f := map[string][]string{} + + err := json.Unmarshal([]byte(query), &f) + if err != nil { + logrus.Infof("convertUrlValuesString: Failed to Unmarshal %s: %s", query, err.Error()) + } + + return reflect.ValueOf(f) +} + +func convertTimeString(query string) reflect.Value { + t, err := time.Parse(time.RFC3339, query) + if err != nil { + logrus.Infof("convertTimeString: Failed to Unmarshal %s: %s", query, err.Error()) + + return reflect.ValueOf(time.Time{}) + } + return reflect.ValueOf(t) +} |