From: Tom Clegg Date: Fri, 18 Sep 2020 17:45:09 +0000 (-0400) Subject: 16850: Add KeyCount field to S3 ListObjects response. X-Git-Tag: 2.1.0~42^2 X-Git-Url: https://git.arvados.org/arvados.git/commitdiff_plain/a3eefdae693e4195ca4f46b7873f3055f4a0d377?hp=40fd03351707cd5892d40014cf366c7ec1834b85 16850: Add KeyCount field to S3 ListObjects response. Arvados-DCO-1.1-Signed-off-by: Tom Clegg --- diff --git a/services/keep-web/s3.go b/services/keep-web/s3.go index 52cfede466..7cd1b1a896 100644 --- a/services/keep-web/s3.go +++ b/services/keep-web/s3.go @@ -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 { diff --git a/services/keep-web/s3_test.go b/services/keep-web/s3_test.go index 66f046b13f..33e978c3b7 100644 --- a/services/keep-web/s3_test.go +++ b/services/keep-web/s3_test.go @@ -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).*2.*`) +} + func (s *IntegrationSuite) TestS3CollectionList(c *check.C) { stage := s.s3setup(c) defer stage.teardown(c)