Merge "bulk response Content-Type does not match request Accept header"
This commit is contained in:
commit
75660a1e9e
@ -247,7 +247,8 @@ class Bulk(object):
|
|||||||
return objs_to_delete
|
return objs_to_delete
|
||||||
|
|
||||||
def handle_delete_iter(self, req, objs_to_delete=None,
|
def handle_delete_iter(self, req, objs_to_delete=None,
|
||||||
user_agent='BulkDelete', swift_source='BD'):
|
user_agent='BulkDelete', swift_source='BD',
|
||||||
|
out_content_type='text/plain'):
|
||||||
"""
|
"""
|
||||||
A generator that can be assigned to a swob Response's app_iter which,
|
A generator that can be assigned to a swob Response's app_iter which,
|
||||||
when iterated over, will delete the objects specified in request body.
|
when iterated over, will delete the objects specified in request body.
|
||||||
@ -268,7 +269,6 @@ class Bulk(object):
|
|||||||
'Number Deleted': 0,
|
'Number Deleted': 0,
|
||||||
'Number Not Found': 0}
|
'Number Not Found': 0}
|
||||||
try:
|
try:
|
||||||
out_content_type = req.accept.best_match(ACCEPTABLE_FORMATS)
|
|
||||||
if not out_content_type:
|
if not out_content_type:
|
||||||
raise HTTPNotAcceptable(request=req)
|
raise HTTPNotAcceptable(request=req)
|
||||||
if out_content_type.endswith('/xml'):
|
if out_content_type.endswith('/xml'):
|
||||||
@ -342,7 +342,8 @@ class Bulk(object):
|
|||||||
yield separator + get_response_body(out_content_type,
|
yield separator + get_response_body(out_content_type,
|
||||||
resp_dict, failed_files)
|
resp_dict, failed_files)
|
||||||
|
|
||||||
def handle_extract_iter(self, req, compress_type):
|
def handle_extract_iter(self, req, compress_type,
|
||||||
|
out_content_type='text/plain'):
|
||||||
"""
|
"""
|
||||||
A generator that can be assigned to a swob Response's app_iter which,
|
A generator that can be assigned to a swob Response's app_iter which,
|
||||||
when iterated over, will extract and PUT the objects pulled from the
|
when iterated over, will extract and PUT the objects pulled from the
|
||||||
@ -362,7 +363,6 @@ class Bulk(object):
|
|||||||
separator = ''
|
separator = ''
|
||||||
existing_containers = set()
|
existing_containers = set()
|
||||||
try:
|
try:
|
||||||
out_content_type = req.accept.best_match(ACCEPTABLE_FORMATS)
|
|
||||||
if not out_content_type:
|
if not out_content_type:
|
||||||
raise HTTPNotAcceptable(request=req)
|
raise HTTPNotAcceptable(request=req)
|
||||||
if out_content_type.endswith('/xml'):
|
if out_content_type.endswith('/xml'):
|
||||||
@ -488,12 +488,20 @@ class Bulk(object):
|
|||||||
'tar.bz2': 'bz2'}.get(extract_type.lower().strip('.'))
|
'tar.bz2': 'bz2'}.get(extract_type.lower().strip('.'))
|
||||||
if archive_type is not None:
|
if archive_type is not None:
|
||||||
resp = HTTPOk(request=req)
|
resp = HTTPOk(request=req)
|
||||||
resp.app_iter = self.handle_extract_iter(req, archive_type)
|
out_content_type = req.accept.best_match(ACCEPTABLE_FORMATS)
|
||||||
|
if out_content_type:
|
||||||
|
resp.content_type = out_content_type
|
||||||
|
resp.app_iter = self.handle_extract_iter(
|
||||||
|
req, archive_type, out_content_type=out_content_type)
|
||||||
else:
|
else:
|
||||||
resp = HTTPBadRequest("Unsupported archive format")
|
resp = HTTPBadRequest("Unsupported archive format")
|
||||||
if 'bulk-delete' in req.params and req.method == 'DELETE':
|
if 'bulk-delete' in req.params and req.method == 'DELETE':
|
||||||
resp = HTTPOk(request=req)
|
resp = HTTPOk(request=req)
|
||||||
resp.app_iter = self.handle_delete_iter(req)
|
out_content_type = req.accept.best_match(ACCEPTABLE_FORMATS)
|
||||||
|
if out_content_type:
|
||||||
|
resp.content_type = out_content_type
|
||||||
|
resp.app_iter = self.handle_delete_iter(
|
||||||
|
req, out_content_type=out_content_type)
|
||||||
|
|
||||||
return resp or self.app
|
return resp or self.app
|
||||||
|
|
||||||
|
@ -111,9 +111,11 @@ class TestUntar(unittest.TestCase):
|
|||||||
self.app.calls = 0
|
self.app.calls = 0
|
||||||
rmtree(self.testdir)
|
rmtree(self.testdir)
|
||||||
|
|
||||||
def handle_extract_and_iter(self, req, compress_format):
|
def handle_extract_and_iter(self, req, compress_format,
|
||||||
|
out_content_type='application/json'):
|
||||||
resp_body = ''.join(
|
resp_body = ''.join(
|
||||||
self.bulk.handle_extract_iter(req, compress_format))
|
self.bulk.handle_extract_iter(req, compress_format,
|
||||||
|
out_content_type=out_content_type))
|
||||||
return resp_body
|
return resp_body
|
||||||
|
|
||||||
def test_create_container_for_path(self):
|
def test_create_container_for_path(self):
|
||||||
@ -147,8 +149,7 @@ class TestUntar(unittest.TestCase):
|
|||||||
mode=mode)
|
mode=mode)
|
||||||
tar.add(os.path.join(self.testdir, base_name))
|
tar.add(os.path.join(self.testdir, base_name))
|
||||||
tar.close()
|
tar.close()
|
||||||
req = Request.blank('/tar_works/acc/cont/',
|
req = Request.blank('/tar_works/acc/cont/')
|
||||||
headers={'Accept': 'application/json'})
|
|
||||||
req.environ['wsgi.input'] = open(
|
req.environ['wsgi.input'] = open(
|
||||||
os.path.join(self.testdir, 'tar_works.tar' + extension))
|
os.path.join(self.testdir, 'tar_works.tar' + extension))
|
||||||
req.headers['transfer-encoding'] = 'chunked'
|
req.headers['transfer-encoding'] = 'chunked'
|
||||||
@ -157,23 +158,31 @@ class TestUntar(unittest.TestCase):
|
|||||||
self.assertEquals(resp_data['Number Files Created'], 6)
|
self.assertEquals(resp_data['Number Files Created'], 6)
|
||||||
|
|
||||||
# test out xml
|
# test out xml
|
||||||
req = Request.blank('/tar_works/acc/cont/',
|
req = Request.blank('/tar_works/acc/cont/')
|
||||||
headers={'Accept': 'application/xml'})
|
|
||||||
req.environ['wsgi.input'] = open(
|
req.environ['wsgi.input'] = open(
|
||||||
os.path.join(self.testdir, 'tar_works.tar' + extension))
|
os.path.join(self.testdir, 'tar_works.tar' + extension))
|
||||||
req.headers['transfer-encoding'] = 'chunked'
|
req.headers['transfer-encoding'] = 'chunked'
|
||||||
resp_body = self.handle_extract_and_iter(req, compress_format)
|
resp_body = self.handle_extract_and_iter(
|
||||||
|
req, compress_format, 'application/xml')
|
||||||
self.assert_('<response_status>201 Created</response_status>' in
|
self.assert_('<response_status>201 Created</response_status>' in
|
||||||
resp_body)
|
resp_body)
|
||||||
self.assert_('<number_files_created>6</number_files_created>' in
|
self.assert_('<number_files_created>6</number_files_created>' in
|
||||||
resp_body)
|
resp_body)
|
||||||
|
|
||||||
# test out nonexistent format
|
# test out nonexistent format
|
||||||
req = Request.blank('/tar_works/acc/cont/',
|
req = Request.blank('/tar_works/acc/cont/?extract-archive=tar',
|
||||||
headers={'Accept': 'good_xml'})
|
headers={'Accept': 'good_xml'})
|
||||||
|
req.environ['REQUEST_METHOD'] = 'PUT'
|
||||||
req.environ['wsgi.input'] = open(
|
req.environ['wsgi.input'] = open(
|
||||||
os.path.join(self.testdir, 'tar_works.tar' + extension))
|
os.path.join(self.testdir, 'tar_works.tar' + extension))
|
||||||
resp_body = self.handle_extract_and_iter(req, compress_format)
|
req.headers['transfer-encoding'] = 'chunked'
|
||||||
|
|
||||||
|
def fake_start_response(*args, **kwargs):
|
||||||
|
pass
|
||||||
|
|
||||||
|
app_iter = self.bulk(req.environ, fake_start_response)
|
||||||
|
resp_body = ''.join([i for i in app_iter])
|
||||||
|
|
||||||
self.assert_('Response Status: 406' in resp_body)
|
self.assert_('Response Status: 406' in resp_body)
|
||||||
|
|
||||||
def test_extract_call(self):
|
def test_extract_call(self):
|
||||||
@ -205,7 +214,7 @@ class TestUntar(unittest.TestCase):
|
|||||||
req.headers['transfer-encoding'] = 'Chunked'
|
req.headers['transfer-encoding'] = 'Chunked'
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
app_iter = self.bulk(req.environ, fake_start_response)
|
app_iter = self.bulk(req.environ, fake_start_response)
|
||||||
resp_body = ''.join([i for i in app_iter])
|
list(app_iter) # iter over resp
|
||||||
self.assertEquals(self.app.calls, 7)
|
self.assertEquals(self.app.calls, 7)
|
||||||
|
|
||||||
self.app.calls = 0
|
self.app.calls = 0
|
||||||
@ -229,7 +238,7 @@ class TestUntar(unittest.TestCase):
|
|||||||
req.environ['wsgi.input'] = open(
|
req.environ['wsgi.input'] = open(
|
||||||
os.path.join(self.testdir, 'tar_works.tar'))
|
os.path.join(self.testdir, 'tar_works.tar'))
|
||||||
app_iter = self.bulk(req.environ, fake_start_response)
|
app_iter = self.bulk(req.environ, fake_start_response)
|
||||||
resp_body = ''.join([i for i in app_iter])
|
list(app_iter) # iter over resp
|
||||||
self.assertEquals(self.app.calls, 7)
|
self.assertEquals(self.app.calls, 7)
|
||||||
|
|
||||||
def test_bad_container(self):
|
def test_bad_container(self):
|
||||||
@ -263,8 +272,7 @@ class TestUntar(unittest.TestCase):
|
|||||||
{'sub_dir2': ['sub2_file1', 'sub2_file2']},
|
{'sub_dir2': ['sub2_file1', 'sub2_file2']},
|
||||||
{'sub_dir3': [{'sub4_dir1': 'sub4_file1'}]}]}]
|
{'sub_dir3': [{'sub4_dir1': 'sub4_file1'}]}]}]
|
||||||
self.build_tar(dir_tree)
|
self.build_tar(dir_tree)
|
||||||
req = Request.blank('/tar_works/acc/',
|
req = Request.blank('/tar_works/acc/')
|
||||||
headers={'Accept': 'application/json'})
|
|
||||||
req.environ['wsgi.input'] = open(os.path.join(self.testdir,
|
req.environ['wsgi.input'] = open(os.path.join(self.testdir,
|
||||||
'tar_fails.tar'))
|
'tar_fails.tar'))
|
||||||
req.headers['transfer-encoding'] = 'chunked'
|
req.headers['transfer-encoding'] = 'chunked'
|
||||||
@ -278,7 +286,8 @@ class TestUntar(unittest.TestCase):
|
|||||||
req.environ['wsgi.input'] = open(os.path.join(self.testdir,
|
req.environ['wsgi.input'] = open(os.path.join(self.testdir,
|
||||||
'tar_fails.tar'))
|
'tar_fails.tar'))
|
||||||
req.headers['transfer-encoding'] = 'chunked'
|
req.headers['transfer-encoding'] = 'chunked'
|
||||||
resp_body = self.handle_extract_and_iter(req, '')
|
resp_body = self.handle_extract_and_iter(
|
||||||
|
req, '', out_content_type='text/plain')
|
||||||
self.assertTrue('Response Status: 401 Unauthorized' in resp_body)
|
self.assertTrue('Response Status: 401 Unauthorized' in resp_body)
|
||||||
|
|
||||||
def test_extract_tar_fail_obj_401(self):
|
def test_extract_tar_fail_obj_401(self):
|
||||||
@ -287,7 +296,8 @@ class TestUntar(unittest.TestCase):
|
|||||||
req.environ['wsgi.input'] = open(os.path.join(self.testdir,
|
req.environ['wsgi.input'] = open(os.path.join(self.testdir,
|
||||||
'tar_fails.tar'))
|
'tar_fails.tar'))
|
||||||
req.headers['transfer-encoding'] = 'chunked'
|
req.headers['transfer-encoding'] = 'chunked'
|
||||||
resp_body = self.handle_extract_and_iter(req, '')
|
resp_body = self.handle_extract_and_iter(
|
||||||
|
req, '', out_content_type='text/plain')
|
||||||
self.assertTrue('Response Status: 401 Unauthorized' in resp_body)
|
self.assertTrue('Response Status: 401 Unauthorized' in resp_body)
|
||||||
|
|
||||||
def test_extract_tar_fail_obj_name_len(self):
|
def test_extract_tar_fail_obj_name_len(self):
|
||||||
@ -416,8 +426,9 @@ class TestDelete(unittest.TestCase):
|
|||||||
self.app.calls = 0
|
self.app.calls = 0
|
||||||
self.app.delete_paths = []
|
self.app.delete_paths = []
|
||||||
|
|
||||||
def handle_delete_and_iter(self, req):
|
def handle_delete_and_iter(self, req, out_content_type='application/json'):
|
||||||
resp_body = ''.join(self.bulk.handle_delete_iter(req))
|
resp_body = ''.join(self.bulk.handle_delete_iter(
|
||||||
|
req, out_content_type=out_content_type))
|
||||||
return resp_body
|
return resp_body
|
||||||
|
|
||||||
def test_bulk_delete_works(self):
|
def test_bulk_delete_works(self):
|
||||||
@ -446,15 +457,16 @@ class TestDelete(unittest.TestCase):
|
|||||||
resp_data = json.loads(resp_body)
|
resp_data = json.loads(resp_body)
|
||||||
self.assertEquals(resp_data['Response Status'], '406 Not Acceptable')
|
self.assertEquals(resp_data['Response Status'], '406 Not Acceptable')
|
||||||
|
|
||||||
def test_bulk_delete_call(self):
|
def test_bulk_delete_call_and_content_type(self):
|
||||||
def fake_start_response(*args, **kwargs):
|
def fake_start_response(*args, **kwargs):
|
||||||
pass
|
self.assertEquals(args[1][0], ('Content-Type', 'application/json'))
|
||||||
|
|
||||||
req = Request.blank('/delete_works/AUTH_Acc?bulk-delete')
|
req = Request.blank('/delete_works/AUTH_Acc?bulk-delete')
|
||||||
req.method = 'DELETE'
|
req.method = 'DELETE'
|
||||||
req.headers['Transfer-Encoding'] = 'chunked'
|
req.headers['Transfer-Encoding'] = 'chunked'
|
||||||
|
req.headers['Accept'] = 'application/json'
|
||||||
req.environ['wsgi.input'] = StringIO('/c/f')
|
req.environ['wsgi.input'] = StringIO('/c/f')
|
||||||
list(self.bulk(req.environ,
|
list(self.bulk(req.environ, fake_start_response)) # iterate over resp
|
||||||
fake_start_response)) # iterate over whole resp
|
|
||||||
self.assertEquals(
|
self.assertEquals(
|
||||||
self.app.delete_paths, ['/delete_works/AUTH_Acc/c/f'])
|
self.app.delete_paths, ['/delete_works/AUTH_Acc/c/f'])
|
||||||
self.assertEquals(self.app.calls, 1)
|
self.assertEquals(self.app.calls, 1)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user