Merge "multi_delete: return UserKeyMustBeSpecified when key is missing"
This commit is contained in:
@@ -17,7 +17,7 @@ from swift3.controllers.base import Controller, bucket_operation
|
|||||||
from swift3.etree import Element, SubElement, fromstring, tostring, \
|
from swift3.etree import Element, SubElement, fromstring, tostring, \
|
||||||
XMLSyntaxError, DocumentInvalid
|
XMLSyntaxError, DocumentInvalid
|
||||||
from swift3.response import HTTPOk, S3NotImplemented, NoSuchKey, \
|
from swift3.response import HTTPOk, S3NotImplemented, NoSuchKey, \
|
||||||
ErrorResponse, MalformedXML
|
ErrorResponse, MalformedXML, UserKeyMustBeSpecified
|
||||||
from swift3.cfg import CONF
|
from swift3.cfg import CONF
|
||||||
from swift3.utils import LOGGER
|
from swift3.utils import LOGGER
|
||||||
|
|
||||||
@@ -37,6 +37,8 @@ class MultiObjectDeleteController(Controller):
|
|||||||
def object_key_iter(elem):
|
def object_key_iter(elem):
|
||||||
for obj in elem.iterchildren('Object'):
|
for obj in elem.iterchildren('Object'):
|
||||||
key = obj.find('./Key').text
|
key = obj.find('./Key').text
|
||||||
|
if not key:
|
||||||
|
raise UserKeyMustBeSpecified()
|
||||||
version = obj.find('./VersionId')
|
version = obj.find('./VersionId')
|
||||||
if version is not None:
|
if version is not None:
|
||||||
version = version.text
|
version = version.text
|
||||||
|
|||||||
@@ -97,6 +97,28 @@ class TestSwift3MultiDelete(Swift3TestCase):
|
|||||||
elem = fromstring(body)
|
elem = fromstring(body)
|
||||||
self.assertEquals(len(elem.findall('Deleted')), 0)
|
self.assertEquals(len(elem.findall('Deleted')), 0)
|
||||||
|
|
||||||
|
def test_object_multi_DELETE_no_key(self):
|
||||||
|
self.swift.register('DELETE', '/v1/AUTH_test/bucket/Key1',
|
||||||
|
swob.HTTPNoContent, {}, None)
|
||||||
|
self.swift.register('DELETE', '/v1/AUTH_test/bucket/Key2',
|
||||||
|
swob.HTTPNotFound, {}, None)
|
||||||
|
|
||||||
|
elem = Element('Delete')
|
||||||
|
SubElement(elem, 'Quiet').text = 'true'
|
||||||
|
for key in ['Key1', 'Key2']:
|
||||||
|
obj = SubElement(elem, 'Object')
|
||||||
|
SubElement(obj, 'Key')
|
||||||
|
body = tostring(elem, use_s3ns=False)
|
||||||
|
content_md5 = md5(body).digest().encode('base64').strip()
|
||||||
|
|
||||||
|
req = Request.blank('/bucket?delete',
|
||||||
|
environ={'REQUEST_METHOD': 'POST'},
|
||||||
|
headers={'Authorization': 'AWS test:tester:hmac',
|
||||||
|
'Content-MD5': content_md5},
|
||||||
|
body=body)
|
||||||
|
status, headers, body = self.call_swift3(req)
|
||||||
|
self.assertEquals(self._get_error_code(body), 'UserKeyMustBeSpecified')
|
||||||
|
|
||||||
def test_object_multi_DELETE_with_invalid_md5(self):
|
def test_object_multi_DELETE_with_invalid_md5(self):
|
||||||
elem = Element('Delete')
|
elem = Element('Delete')
|
||||||
for key in ['Key1', 'Key2']:
|
for key in ['Key1', 'Key2']:
|
||||||
|
|||||||
Reference in New Issue
Block a user