diff --git a/http/client.go b/http/client.go index ca4fa93a1f4e0e6cea667a36c1a26df9395a63e8..a450025852aedc1171c28709b1312c9cb36774b4 100644 --- a/http/client.go +++ b/http/client.go @@ -230,6 +230,15 @@ func getQuery(req *cmds.Request) (string, error) { if OptionSkipMap[k] { continue } + + optArr, ok := v.([]string) + if ok { + for _, o := range optArr { + query.Add(k, o) + } + continue + } + str := fmt.Sprintf("%v", v) query.Set(k, str) } diff --git a/http/parse.go b/http/parse.go index a7bfa67bab5def148fcc391c8fb1d7336d56e99f..0915ddf0ff8a58a32b458c868fe16d69eb5c7289 100644 --- a/http/parse.go +++ b/http/parse.go @@ -61,22 +61,28 @@ func parseRequest(r *http.Request, root *cmds.Command) (*cmds.Request, error) { } opts, stringArgs2 := parseOptions(r) + iopts := make(map[string]interface{}, len(opts)) optDefs, err := root.GetOptions(pth) if err != nil { return nil, err } for k, v := range opts { + iopts[k] = v if optDef, ok := optDefs[k]; ok { name := optDef.Names()[0] if k != name { - opts[name] = v - delete(opts, k) + iopts[name] = v + delete(iopts, k) + } + + if optDef.Type() != cmds.Strings && len(v) > 0 { + iopts[name] = v[0] } } } // default to setting encoding to JSON - if _, ok := opts[cmds.EncLong]; !ok { - opts[cmds.EncLong] = cmds.JSON + if _, ok := iopts[cmds.EncLong]; !ok { + iopts[cmds.EncLong] = cmds.JSON } stringArgs = append(stringArgs, stringArgs2...) @@ -148,7 +154,7 @@ func parseRequest(r *http.Request, root *cmds.Command) (*cmds.Request, error) { } ctx := logging.ContextWithLoggable(r.Context(), uuidLoggable()) - req, err := cmds.NewRequest(ctx, pth, opts, args, f, root) + req, err := cmds.NewRequest(ctx, pth, iopts, args, f, root) if err != nil { return nil, err } @@ -162,8 +168,8 @@ func parseRequest(r *http.Request, root *cmds.Command) (*cmds.Request, error) { return req, err } -func parseOptions(r *http.Request) (map[string]interface{}, []string) { - opts := make(map[string]interface{}) +func parseOptions(r *http.Request) (map[string][]string, []string) { + opts := make(map[string][]string) var args []string query := r.URL.Query() @@ -171,8 +177,7 @@ func parseOptions(r *http.Request) (map[string]interface{}, []string) { if k == "arg" { args = v } else { - - opts[k] = v[0] + opts[k] = v } } diff --git a/request.go b/request.go index 4eca412a5c9a209e9df739df72da3f446b20f619..ea747254c60f8ff2c8a0934e066244972bc4b83c 100644 --- a/request.go +++ b/request.go @@ -118,21 +118,28 @@ func checkAndConvertOptions(root *Command, opts OptMap, path []string) (OptMap, kind := reflect.TypeOf(v).Kind() if kind != opt.Type() { - if str, ok := v.(string); ok { - val, err := opt.Parse(str) - if err != nil { - value := fmt.Sprintf("value %q", v) - if len(str) == 0 { - value = "empty value" - } - return options, fmt.Errorf("could not convert %s to type %q (for option %q)", - value, opt.Type().String(), "-"+k) + if opt.Type() == Strings { + if _, ok := v.([]string); !ok { + return options, fmt.Errorf("option %q should be type %q, but got type %q", + k, opt.Type().String(), kind.String()) } - options[k] = val - } else { - return options, fmt.Errorf("option %q should be type %q, but got type %q", - k, opt.Type().String(), kind.String()) + if str, ok := v.(string); ok { + val, err := opt.Parse(str) + if err != nil { + value := fmt.Sprintf("value %q", v) + if len(str) == 0 { + value = "empty value" + } + return options, fmt.Errorf("could not convert %s to type %q (for option %q)", + value, opt.Type().String(), "-"+k) + } + options[k] = val + + } else { + return options, fmt.Errorf("option %q should be type %q, but got type %q", + k, opt.Type().String(), kind.String()) + } } }