PUT with X-Copy-From header and a non-zero Content-Length will now error as a 400
This commit is contained in:
commit
937554c85e
@ -100,6 +100,9 @@ def check_object_creation(req, object_name):
|
|||||||
if req.content_length is None and \
|
if req.content_length is None and \
|
||||||
req.headers.get('transfer-encoding') != 'chunked':
|
req.headers.get('transfer-encoding') != 'chunked':
|
||||||
return HTTPLengthRequired(request=req)
|
return HTTPLengthRequired(request=req)
|
||||||
|
if 'X-Copy-From' in req.headers and req.content_length:
|
||||||
|
return HTTPBadRequest(body='Copy requests require a zero byte body',
|
||||||
|
request=req, content_type='text/plain')
|
||||||
if len(object_name) > MAX_OBJECT_NAME_LENGTH:
|
if len(object_name) > MAX_OBJECT_NAME_LENGTH:
|
||||||
return HTTPBadRequest(body='Object name length of %d longer than %d' %
|
return HTTPBadRequest(body='Object name length of %d longer than %d' %
|
||||||
(len(object_name), MAX_OBJECT_NAME_LENGTH), request=req,
|
(len(object_name), MAX_OBJECT_NAME_LENGTH), request=req,
|
||||||
|
@ -644,7 +644,8 @@ class ObjectController(Controller):
|
|||||||
environ=req.environ, headers=req.headers)
|
environ=req.environ, headers=req.headers)
|
||||||
new_req.content_length = source_resp.content_length
|
new_req.content_length = source_resp.content_length
|
||||||
new_req.etag = source_resp.etag
|
new_req.etag = source_resp.etag
|
||||||
new_req.headers['X-Copy-From'] = source_header.split('/', 2)[2]
|
# we no longer need the X-Copy-From header
|
||||||
|
del new_req.headers['X-Copy-From']
|
||||||
for k, v in source_resp.headers.items():
|
for k, v in source_resp.headers.items():
|
||||||
if k.lower().startswith('x-object-meta-'):
|
if k.lower().startswith('x-object-meta-'):
|
||||||
new_req.headers[k] = v
|
new_req.headers[k] = v
|
||||||
@ -767,8 +768,9 @@ class ObjectController(Controller):
|
|||||||
bodies.append('')
|
bodies.append('')
|
||||||
resp = self.best_response(req, statuses, reasons, bodies, 'Object PUT',
|
resp = self.best_response(req, statuses, reasons, bodies, 'Object PUT',
|
||||||
etag=etag)
|
etag=etag)
|
||||||
if 'x-copy-from' in req.headers:
|
if source_header:
|
||||||
resp.headers['X-Copied-From'] = req.headers['x-copy-from']
|
resp.headers['X-Copied-From'] = quote(
|
||||||
|
source_header.split('/', 2)[2])
|
||||||
for k, v in req.headers.items():
|
for k, v in req.headers.items():
|
||||||
if k.lower().startswith('x-object-meta-'):
|
if k.lower().startswith('x-object-meta-'):
|
||||||
resp.headers[k] = v
|
resp.headers[k] = v
|
||||||
|
@ -1089,6 +1089,17 @@ class TestObjectController(unittest.TestCase):
|
|||||||
self.assertEquals(resp.status_int, 201)
|
self.assertEquals(resp.status_int, 201)
|
||||||
self.assertEquals(resp.headers['x-copied-from'], 'c/o')
|
self.assertEquals(resp.headers['x-copied-from'], 'c/o')
|
||||||
|
|
||||||
|
req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'},
|
||||||
|
headers={'Content-Length': '5',
|
||||||
|
'X-Copy-From': 'c/o'})
|
||||||
|
self.app.update_request(req)
|
||||||
|
proxy_server.http_connect = \
|
||||||
|
fake_http_connect(200, 200, 200, 200, 200)
|
||||||
|
# acct cont acct cont objc
|
||||||
|
self.app.memcache.store = {}
|
||||||
|
resp = controller.PUT(req)
|
||||||
|
self.assertEquals(resp.status_int, 400)
|
||||||
|
|
||||||
req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'},
|
req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'},
|
||||||
headers={'Content-Length': '0',
|
headers={'Content-Length': '0',
|
||||||
'X-Copy-From': 'c/o/o2'})
|
'X-Copy-From': 'c/o/o2'})
|
||||||
@ -1101,6 +1112,18 @@ class TestObjectController(unittest.TestCase):
|
|||||||
self.assertEquals(resp.status_int, 201)
|
self.assertEquals(resp.status_int, 201)
|
||||||
self.assertEquals(resp.headers['x-copied-from'], 'c/o/o2')
|
self.assertEquals(resp.headers['x-copied-from'], 'c/o/o2')
|
||||||
|
|
||||||
|
req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'},
|
||||||
|
headers={'Content-Length': '0',
|
||||||
|
'X-Copy-From': 'c/o%20o2'})
|
||||||
|
req.account = 'a'
|
||||||
|
proxy_server.http_connect = \
|
||||||
|
fake_http_connect(200, 200, 200, 200, 200, 201, 201, 201)
|
||||||
|
# acct cont acct cont objc obj obj obj
|
||||||
|
self.app.memcache.store = {}
|
||||||
|
resp = controller.PUT(req)
|
||||||
|
self.assertEquals(resp.status_int, 201)
|
||||||
|
self.assertEquals(resp.headers['x-copied-from'], 'c/o%20o2')
|
||||||
|
|
||||||
# repeat tests with leading /
|
# repeat tests with leading /
|
||||||
req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'},
|
req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'},
|
||||||
headers={'Content-Length': '0',
|
headers={'Content-Length': '0',
|
||||||
|
Loading…
Reference in New Issue
Block a user