summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Burke <tim.burke@gmail.com>2018-05-30 15:52:16 -0700
committerTim Burke <tim.burke@gmail.com>2019-01-03 11:38:38 -0800
commite58b70cac933e80fe6a595badb95e819cc9f396c (patch)
treef9741791e2b2af2ec190dead27e5d6fdad8078da
parent3aff40b0bf6fc63a9185ee349d5e195b1198959a (diff)
downloadswift-e58b70cac933e80fe6a595badb95e819cc9f396c.tar.gz
copy: Stop hanging per-request data on middleware instance
Change-Id: Ib7b208669e900b84a7759819ef76b7b5b7ce8c9a Closes-Bug: 1774719 (cherry picked from commit 9ef2a828166aece6b374a97b0777b90c359fdebd)
-rw-r--r--swift/common/middleware/copy.py33
1 files changed, 15 insertions, 18 deletions
diff --git a/swift/common/middleware/copy.py b/swift/common/middleware/copy.py
index 312d406aa..12b53c01e 100644
--- a/swift/common/middleware/copy.py
+++ b/swift/common/middleware/copy.py
@@ -317,10 +317,6 @@ class ServerSideCopyMiddleware(object):
# If obj component is not present in req, do not proceed further.
return self.app(env, start_response)
- self.account_name = account
- self.container_name = container
- self.object_name = obj
-
try:
# In some cases, save off original request method since it gets
# mutated into PUT during handling. This way logging can display
@@ -329,10 +325,12 @@ class ServerSideCopyMiddleware(object):
return self.handle_PUT(req, start_response)
elif req.method == 'COPY':
req.environ['swift.orig_req_method'] = req.method
- return self.handle_COPY(req, start_response)
+ return self.handle_COPY(req, start_response,
+ account, container, obj)
elif req.method == 'POST' and self.object_post_as_copy:
req.environ['swift.orig_req_method'] = req.method
- return self.handle_object_post_as_copy(req, start_response)
+ return self.handle_object_post_as_copy(req, start_response,
+ account, container, obj)
elif req.method == 'OPTIONS':
# Does not interfere with OPTIONS response from
# (account,container) servers and /info response.
@@ -343,14 +341,13 @@ class ServerSideCopyMiddleware(object):
return self.app(env, start_response)
- def handle_object_post_as_copy(self, req, start_response):
+ def handle_object_post_as_copy(self, req, start_response,
+ account, container, obj):
req.method = 'PUT'
- req.path_info = '/v1/%s/%s/%s' % (
- self.account_name, self.container_name, self.object_name)
+ req.path_info = '/v1/%s/%s/%s' % (account, container, obj)
req.headers['Content-Length'] = 0
req.headers.pop('Range', None)
- req.headers['X-Copy-From'] = quote('/%s/%s' % (self.container_name,
- self.object_name))
+ req.headers['X-Copy-From'] = quote('/%s/%s' % (container, obj))
req.environ['swift.post_as_copy'] = True
params = req.params
# for post-as-copy always copy the manifest itself if source is *LO
@@ -358,22 +355,22 @@ class ServerSideCopyMiddleware(object):
req.params = params
return self.handle_PUT(req, start_response)
- def handle_COPY(self, req, start_response):
+ def handle_COPY(self, req, start_response, account, container, obj):
if not req.headers.get('Destination'):
return HTTPPreconditionFailed(request=req,
body='Destination header required'
)(req.environ, start_response)
- dest_account = self.account_name
+ dest_account = account
if 'Destination-Account' in req.headers:
dest_account = req.headers.get('Destination-Account')
dest_account = check_account_format(req, dest_account)
- req.headers['X-Copy-From-Account'] = self.account_name
- self.account_name = dest_account
+ req.headers['X-Copy-From-Account'] = account
+ account = dest_account
del req.headers['Destination-Account']
dest_container, dest_object = _check_destination_header(req)
- source = '/%s/%s' % (self.container_name, self.object_name)
- self.container_name = dest_container
- self.object_name = dest_object
+ source = '/%s/%s' % (container, obj)
+ container = dest_container
+ obj = dest_object
# re-write the existing request as a PUT instead of creating a new one
req.method = 'PUT'
# As this the path info is updated with destination container,