From 3eee16d825846b0df53218fbd3755f99061a5faa Mon Sep 17 00:00:00 2001 From: Daira Hopwood Date: Tue, 18 Mar 2014 01:03:24 +0000 Subject: [PATCH] S3 container: treat an empty GET bucket response as an error. Signed-off-by: Daira Hopwood --- .../storage/backends/cloud/s3/s3_container.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/allmydata/storage/backends/cloud/s3/s3_container.py b/src/allmydata/storage/backends/cloud/s3/s3_container.py index 84b9edb9..806ae611 100644 --- a/src/allmydata/storage/backends/cloud/s3/s3_container.py +++ b/src/allmydata/storage/backends/cloud/s3/s3_container.py @@ -1,6 +1,11 @@ from zope.interface import implements +try: + from xml.etree.ElementTree import ParseError +except ImportError: + from elementtree.ElementTree import ParseError + from allmydata.node import InvalidValueError from allmydata.storage.backends.cloud.cloud_common import IContainer, \ ContainerRetryMixin, ContainerListMixin @@ -65,8 +70,16 @@ class S3Container(ContainerRetryMixin, ContainerListMixin): def delete(self): return self._do_request('delete bucket', self.client.delete_bucket, self.container_name) + def _get_bucket(self, container_name, **kwargs): + d = self.client.get_bucket(container_name, **kwargs) + def _err(f): + f.trap(ParseError) + raise self.ServiceError("", 500, "list objects: response body is not valid XML (possibly empty)\n" + f) + d.addErrback(_err) + return d + def list_some_objects(self, **kwargs): - return self._do_request('list objects', self.client.get_bucket, self.container_name, **kwargs) + return self._do_request('list objects', self._get_bucket, self.container_name, **kwargs) def put_object(self, object_name, data, content_type='application/octet-stream', metadata={}): return self._do_request('PUT object', self.client.put_object, self.container_name, -- 2.45.2