16850: Add KeyCount field to S3 ListObjects response.
authorTom Clegg <tom@tomclegg.ca>
Fri, 18 Sep 2020 17:45:09 +0000 (13:45 -0400)
committerTom Clegg <tom@tomclegg.ca>
Fri, 18 Sep 2020 17:45:09 +0000 (13:45 -0400)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tom@tomclegg.ca>

services/keep-web/s3.go
services/keep-web/s3_test.go

index 52cfede46642120dce520868d2d38758fb97cc12..7cd1b1a896e3fa56eaa60db2f5d4851ac9430b39 100644 (file)
@@ -363,6 +363,8 @@ func (h *handler) s3list(w http.ResponseWriter, r *http.Request, fs arvados.Cust
                // github.com/aws/aws-sdk-net never terminates its
                // paging loop).
                NextMarker string `xml:"NextMarker,omitempty"`
+               // ListObjectsV2 has a KeyCount response field.
+               KeyCount int
        }
        resp := listResp{
                ListResp: s3.ListResp{
@@ -459,6 +461,7 @@ func (h *handler) s3list(w http.ResponseWriter, r *http.Request, fs arvados.Cust
                }
                sort.Slice(resp.CommonPrefixes, func(i, j int) bool { return resp.CommonPrefixes[i].Prefix < resp.CommonPrefixes[j].Prefix })
        }
+       resp.KeyCount = len(resp.Contents)
        w.Header().Set("Content-Type", "application/xml")
        io.WriteString(w, xml.Header)
        if err := xml.NewEncoder(w).Encode(resp); err != nil {
index 66f046b13f14674c35bc783351eb9a0bf5f1b64b..33e978c3b7acec6e196e06db884bd6e519eb8964 100644 (file)
@@ -432,6 +432,22 @@ func (s *IntegrationSuite) TestS3ListNoNextMarker(c *check.C) {
        }
 }
 
+// List response should include KeyCount field.
+func (s *IntegrationSuite) TestS3ListKeyCount(c *check.C) {
+       stage := s.s3setup(c)
+       defer stage.teardown(c)
+
+       req, err := http.NewRequest("GET", stage.collbucket.URL("/"), nil)
+       c.Assert(err, check.IsNil)
+       req.Header.Set("Authorization", "AWS "+arvadostest.ActiveTokenV2+":none")
+       req.URL.RawQuery = "prefix=&delimiter=/"
+       resp, err := http.DefaultClient.Do(req)
+       c.Assert(err, check.IsNil)
+       buf, err := ioutil.ReadAll(resp.Body)
+       c.Assert(err, check.IsNil)
+       c.Check(string(buf), check.Matches, `(?ms).*<KeyCount>2</KeyCount>.*`)
+}
+
 func (s *IntegrationSuite) TestS3CollectionList(c *check.C) {
        stage := s.s3setup(c)
        defer stage.teardown(c)