14287: Fix accepting boolean params via query string.
authorTom Clegg <tclegg@veritasgenetics.com>
Tue, 7 May 2019 13:39:58 +0000 (09:39 -0400)
committerTom Clegg <tclegg@veritasgenetics.com>
Mon, 17 Jun 2019 13:54:39 +0000 (09:54 -0400)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg@veritasgenetics.com>

lib/controller/router/request.go
lib/controller/router/router_test.go

index 67d4e0ffb6280b7ef5dde458dfe98770a4a55b4e..8ea253e6c402569fd2ed0a5a141cbd8cc32c6dab 100644 (file)
@@ -29,6 +29,8 @@ func (rtr *router) loadRequestParams(req *http.Request, attrsKey string) (map[st
        for k, values := range req.Form {
                for _, v := range values {
                        switch {
+                       case boolParams[k]:
+                               params[k] = stringToBool(v)
                        case v == "null" || v == "":
                                params[k] = nil
                        case strings.HasPrefix(v, "["):
@@ -110,3 +112,18 @@ func (rtr *router) transcode(src interface{}, dst interface{}) error {
        }
        return err
 }
+
+var boolParams = map[string]bool{
+       "ensure_unique_name":   true,
+       "include_trash":        true,
+       "include_old_versions": true,
+}
+
+func stringToBool(s string) bool {
+       switch s {
+       case "", "false", "0":
+               return false
+       default:
+               return true
+       }
+}
index e7355dc54418e6027c62de8e8a56ef6f8575df74..22d08c8423be5a5359cdf48c51c21f1c70024519 100644 (file)
@@ -5,6 +5,7 @@
 package router
 
 import (
+       "bytes"
        "encoding/json"
        "io"
        "net/http"
@@ -56,6 +57,26 @@ func (s *RouterSuite) doRequest(c *check.C, token, method, path string, hdrs htt
        return req, rw, jresp
 }
 
+func (s *RouterSuite) TestCollectionParams(c *check.C) {
+       token := arvadostest.ActiveTokenV2
+
+       _, rw, jresp := s.doRequest(c, token, "GET", `/arvados/v1/collections?include_trash=true`, nil, nil)
+       c.Check(rw.Code, check.Equals, http.StatusOK)
+       c.Check(jresp["items_available"], check.FitsTypeOf, float64(0))
+
+       _, rw, jresp = s.doRequest(c, token, "GET", `/arvados/v1/collections`, nil, bytes.NewBufferString(`{"include_trash":true}`))
+       c.Check(rw.Code, check.Equals, http.StatusOK)
+       c.Check(jresp["items"], check.FitsTypeOf, []interface{}{})
+
+       _, rw, jresp = s.doRequest(c, token, "POST", `/arvados/v1/collections`, nil, bytes.NewBufferString(`ensure_unique_name=true`))
+       c.Check(rw.Code, check.Equals, http.StatusOK)
+       c.Check(jresp["uuid"], check.FitsTypeOf, "")
+
+       _, rw, jresp = s.doRequest(c, token, "POST", `/arvados/v1/collections?ensure_unique_name=true`, nil, nil)
+       c.Check(rw.Code, check.Equals, http.StatusOK)
+       c.Check(jresp["uuid"], check.FitsTypeOf, "")
+}
+
 func (s *RouterSuite) TestContainerList(c *check.C) {
        token := arvadostest.ActiveTokenV2