diff options
Diffstat (limited to 'net-fs/s3ql/files/s3ql-2.14-ceph.patch')
-rw-r--r-- | net-fs/s3ql/files/s3ql-2.14-ceph.patch | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/net-fs/s3ql/files/s3ql-2.14-ceph.patch b/net-fs/s3ql/files/s3ql-2.14-ceph.patch new file mode 100644 index 000000000000..f5b4c3b123e5 --- /dev/null +++ b/net-fs/s3ql/files/s3ql-2.14-ceph.patch @@ -0,0 +1,75 @@ +https://bitbucket.org/nikratio/s3ql/issues/190/sq3l-should-not-rely-on-xmlns-declarations +https://bitbucket.org/nikratio/s3ql/pull-requests/5/s3c-be-more-lenient-about-xml-namespaces + +--- s3ql-2.14/src/s3ql/backends/s3c.py 2015-07-20 19:41:07.000000000 -0700 ++++ s3ql-2.14/src/s3ql/backends/s3c.py 2016-01-21 22:41:33.000000000 -0800 +@@ -126,6 +126,15 @@ + conn.timeout = int(self.options.get('tcp-timeout', 20)) + return conn + ++ @staticmethod ++ def _tag_xmlns_uri(elem): ++ '''Extract the XML namespace (xmlns) URI from an element''' ++ if elem.tag[0] == '{': ++ uri, ignore, tag = elem.tag[1:].partition("}") ++ else: ++ uri = None ++ return uri ++ + # This method is also used implicitly for the retry handling of + # `gs.Backend._get_access_token`. When modifying this method, do not forget + # to check if this makes it unsuitable for use by `_get_access_token` (in +@@ -215,7 +224,6 @@ + keys_remaining = True + marker = self.prefix + start_after + prefix = self.prefix + prefix +- ns_p = self.xml_ns_prefix + + while keys_remaining: + log.debug('requesting with marker=%s', marker) +@@ -232,16 +240,27 @@ + try: + itree = iter(ElementTree.iterparse(self.conn, events=("start", "end"))) + (event, root) = next(itree) ++ ++ root_xmlns_uri = self._tag_xmlns_uri(root) ++ if root_xmlns_uri is None: ++ root_xmlns_prefix = '' ++ else: ++ # Validate the XML namespace ++ root_xmlns_prefix = '{%s}' % (root_xmlns_uri, ) ++ if root_xmlns_prefix != self.xml_ns_prefix: ++ log.error('Unexpected server reply to list operation:\n%s', ++ self._dump_response(resp, body=None)) ++ raise RuntimeError('List response has %s as root tag, unknown namespace' % root.tag) + + for (event, el) in itree: + if event != 'end': + continue + +- if el.tag == ns_p + 'IsTruncated': ++ if el.tag == root_xmlns_prefix + 'IsTruncated': + keys_remaining = (el.text == 'true') + +- elif el.tag == ns_p + 'Contents': +- marker = el.findtext(ns_p + 'Key') ++ elif el.tag == root_xmlns_prefix + 'Contents': ++ marker = el.findtext(root_xmlns_prefix + 'Key') + yield marker[len(self.prefix):] + root.clear() + +@@ -404,9 +423,12 @@ + return + body = self.conn.readall() + root = self._parse_xml_response(resp, body) +- if root.tag == self.xml_ns_prefix + 'CopyObjectResult': ++ ++ # Some S3 implemenentations do not have a namespace on ++ # CopyObjectResult. ++ if root.tag in [self.xml_ns_prefix + 'CopyObjectResult', 'CopyObjectResult']: + return +- elif root.tag == 'Error': ++ elif root.tag in [self.xml_ns_prefix + 'Error', 'Error']: + raise get_S3Error(root.findtext('Code'), root.findtext('Message'), + resp.headers) + else: |