20541: Auto unselect fields if response body will not be read. 20541-less-fetching-mounts
authorTom Clegg <tom@curii.com>
Wed, 31 May 2023 13:59:30 +0000 (09:59 -0400)
committerTom Clegg <tom@curii.com>
Wed, 31 May 2023 13:59:30 +0000 (09:59 -0400)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tom@curii.com>

sdk/go/arvados/client.go
sdk/go/arvados/client_test.go

index 6316d1bedaceb35bc7d3f5578aff3425078aabb7..e8442e85727cc25acb79da333dceb112a109a8b5 100644 (file)
@@ -502,6 +502,12 @@ func (c *Client) RequestAndDecodeContext(ctx context.Context, dst interface{}, m
        if err != nil {
                return err
        }
+       if dst == nil {
+               if urlValues == nil {
+                       urlValues = url.Values{}
+               }
+               urlValues["select"] = []string{`["uuid"]`}
+       }
        if urlValues == nil {
                // Nothing to send
        } else if body != nil || ((method == "GET" || method == "HEAD") && len(urlValues.Encode()) < 1000) {
index 422aca9f68f9cdf47612170a1feee6416d89e389..41feb4e19f1ac043f932f6de74fec43cec081b44 100644 (file)
@@ -169,6 +169,44 @@ func (*clientSuite) TestAnythingToValues(c *check.C) {
        }
 }
 
+// select=["uuid"] is added automatically when RequestAndDecode's
+// destination argument is nil.
+func (*clientSuite) TestAutoSelectUUID(c *check.C) {
+       var req *http.Request
+       var err error
+       server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+               c.Check(r.ParseForm(), check.IsNil)
+               req = r
+               w.Write([]byte("{}"))
+       }))
+       client := Client{
+               APIHost:   strings.TrimPrefix(server.URL, "https://"),
+               AuthToken: "zzz",
+               Insecure:  true,
+               Timeout:   2 * time.Second,
+       }
+
+       req = nil
+       err = client.RequestAndDecode(nil, http.MethodPost, "test", nil, nil)
+       c.Check(err, check.IsNil)
+       c.Check(req.FormValue("select"), check.Equals, `["uuid"]`)
+
+       req = nil
+       err = client.RequestAndDecode(nil, http.MethodGet, "test", nil, nil)
+       c.Check(err, check.IsNil)
+       c.Check(req.FormValue("select"), check.Equals, `["uuid"]`)
+
+       req = nil
+       err = client.RequestAndDecode(nil, http.MethodGet, "test", nil, map[string]interface{}{"select": []string{"blergh"}})
+       c.Check(err, check.IsNil)
+       c.Check(req.FormValue("select"), check.Equals, `["uuid"]`)
+
+       req = nil
+       err = client.RequestAndDecode(&struct{}{}, http.MethodGet, "test", nil, map[string]interface{}{"select": []string{"blergh"}})
+       c.Check(err, check.IsNil)
+       c.Check(req.FormValue("select"), check.Equals, `["blergh"]`)
+}
+
 func (*clientSuite) TestLoadConfig(c *check.C) {
        oldenv := os.Environ()
        defer func() {