diff --git a/swift/common/middleware/versioned_writes.py b/swift/common/middleware/versioned_writes.py index e3f56f6fd1..6a25c66461 100644 --- a/swift/common/middleware/versioned_writes.py +++ b/swift/common/middleware/versioned_writes.py @@ -119,7 +119,7 @@ from swift.common.utils import get_logger, Timestamp, json, \ register_swift_info, config_true_value from swift.common.request_helpers import get_sys_meta_prefix from swift.common.wsgi import WSGIContext, make_pre_authed_request -from swift.common.swob import Request +from swift.common.swob import Request, HTTPException from swift.common.constraints import ( check_account_format, check_container_format, check_destination_header) from swift.proxy.controllers.base import get_container_info @@ -468,12 +468,18 @@ class VersionedWritesMiddleware(object): # container_info allow_versioned_writes = self.conf.get('allow_versioned_writes') if allow_versioned_writes and container and not obj: - return self.container_request(req, start_response, - allow_versioned_writes) + try: + return self.container_request(req, start_response, + allow_versioned_writes) + except HTTPException as error_response: + return error_response(env, start_response) elif obj and req.method in ('PUT', 'COPY', 'DELETE'): - return self.object_request( - req, version, account, container, obj, - allow_versioned_writes)(env, start_response) + try: + return self.object_request( + req, version, account, container, obj, + allow_versioned_writes)(env, start_response) + except HTTPException as error_response: + return error_response(env, start_response) else: return self.app(env, start_response) diff --git a/test/unit/common/middleware/test_versioned_writes.py b/test/unit/common/middleware/test_versioned_writes.py index 1d38b73f68..52cb6fd44b 100644 --- a/test/unit/common/middleware/test_versioned_writes.py +++ b/test/unit/common/middleware/test_versioned_writes.py @@ -108,11 +108,8 @@ class VersionedWritesTestCase(unittest.TestCase): req = Request.blank('/v1/a/c', headers={'X-Versions-Location': 'ver_cont'}, environ={'REQUEST_METHOD': method}) - try: - status, headers, body = self.call_vw(req) - except swob.HTTPException as e: - pass - self.assertEquals(e.status_int, 412) + status, headers, body = self.call_vw(req) + self.assertEquals(status, "412 Precondition Failed") # GET/HEAD performs as normal self.app.register('GET', '/v1/a/c', swob.HTTPOk, {}, 'passed') @@ -414,6 +411,17 @@ class VersionedWritesTestCase(unittest.TestCase): self.assertEqual(len(self.authorized), 1) self.assertRequestEqual(req, self.authorized[0]) + def test_copy_new_version_bogus_account(self): + cache = FakeCache({'sysmeta': {'versions-location': 'ver_cont'}}) + req = Request.blank( + '/v1/src_a/src_cont/src_obj', + environ={'REQUEST_METHOD': 'COPY', 'swift.cache': cache, + 'CONTENT_LENGTH': '100'}, + headers={'Destination': 'tgt_cont/tgt_obj', + 'Destination-Account': '/im/on/a/boat'}) + status, headers, body = self.call_vw(req) + self.assertEquals(status, '412 Precondition Failed') + def test_delete_first_object_success(self): self.app.register( 'DELETE', '/v1/a/c/o', swob.HTTPOk, {}, 'passed')