diff --git a/swift/account/backend.py b/swift/account/backend.py index 1e4b5d7018..53e60fe0e1 100644 --- a/swift/account/backend.py +++ b/swift/account/backend.py @@ -455,7 +455,7 @@ class AccountBroker(DatabaseBroker): curs.close() return results end = name.find(delimiter, len(prefix)) - if end > 0: + if end >= 0: if reverse: end_marker = name[:end + len(delimiter)] else: diff --git a/test/unit/account/test_server.py b/test/unit/account/test_server.py index 7a2341d786..72093f7265 100644 --- a/test/unit/account/test_server.py +++ b/test/unit/account/test_server.py @@ -1648,6 +1648,57 @@ class TestAccountController(unittest.TestCase): listing.append(node2.firstChild.nodeValue) self.assertEqual(listing, ['sub.1.0', 'sub.1.1', 'sub.1.2']) + def test_GET_leading_delimiter(self): + req = Request.blank('/sda1/p/a', environ={'REQUEST_METHOD': 'PUT', + 'HTTP_X_TIMESTAMP': '0'}) + resp = req.get_response(self.controller) + for first in range(3): + req = Request.blank( + '/sda1/p/a/.sub.%s' % first, + environ={'REQUEST_METHOD': 'PUT'}, + headers={'X-Put-Timestamp': '1', + 'X-Delete-Timestamp': '0', + 'X-Object-Count': '0', + 'X-Bytes-Used': '0', + 'X-Timestamp': normalize_timestamp(0)}) + req.get_response(self.controller) + for second in range(3): + req = Request.blank( + '/sda1/p/a/.sub.%s.%s' % (first, second), + environ={'REQUEST_METHOD': 'PUT'}, + headers={'X-Put-Timestamp': '1', + 'X-Delete-Timestamp': '0', + 'X-Object-Count': '0', + 'X-Bytes-Used': '0', + 'X-Timestamp': normalize_timestamp(0)}) + req.get_response(self.controller) + req = Request.blank('/sda1/p/a?delimiter=.', + environ={'REQUEST_METHOD': 'GET'}) + resp = req.get_response(self.controller) + self.assertEqual(resp.status_int, 200) + self.assertEqual(resp.body.strip().split(b'\n'), + [b'.']) + req = Request.blank('/sda1/p/a?prefix=.&delimiter=.', + environ={'REQUEST_METHOD': 'GET'}) + resp = req.get_response(self.controller) + self.assertEqual(resp.status_int, 200) + self.assertEqual(resp.body.strip().split(b'\n'), + [b'.sub.']) + req = Request.blank('/sda1/p/a?prefix=.sub.&delimiter=.', + environ={'REQUEST_METHOD': 'GET'}) + resp = req.get_response(self.controller) + self.assertEqual(resp.status_int, 200) + self.assertEqual( + resp.body.strip().split(b'\n'), + [b'.sub.0', b'.sub.0.', b'.sub.1', b'.sub.1.', + b'.sub.2', b'.sub.2.']) + req = Request.blank('/sda1/p/a?prefix=.sub.1.&delimiter=.', + environ={'REQUEST_METHOD': 'GET'}) + resp = req.get_response(self.controller) + self.assertEqual(resp.status_int, 200) + self.assertEqual(resp.body.strip().split(b'\n'), + [b'.sub.1.0', b'.sub.1.1', b'.sub.1.2']) + def test_GET_multichar_delimiter(self): self.maxDiff = None req = Request.blank('/sda1/p/a', method='PUT', headers={