Raise HTTPUnsupportedMediaType when content type is unsupported

Instead of 500 internal error, now cinder will raise
HTTPUnsupportedMediaType when any unsupported content type is being
used.

Change-Id: I024769114caafe8d0e70babd93382702f45aafcc
Closes-Bug: #1715094
This commit is contained in:
TommyLike 2018-08-21 14:00:04 +08:00
parent 0652085f23
commit afae1e4b41
3 changed files with 16 additions and 12 deletions

View File

@ -718,12 +718,7 @@ class Resource(wsgi.Application):
if len(request.body) == 0:
LOG.debug("Empty body provided in request")
return None, ''
try:
content_type = request.get_content_type()
except exception.InvalidContentType:
LOG.debug("Unrecognized Content-Type provided in request")
return None, ''
if not content_type:
LOG.debug("No Content-Type provided in request")
@ -832,9 +827,14 @@ class Resource(wsgi.Application):
# content type
action_args = self.get_action_args(request.environ)
action = action_args.pop('action', None)
# NOTE(sdague): we filter out InvalidContentTypes early so we
# know everything is good from here on out.
try:
content_type, body = self.get_body(request)
accept = request.best_match_content_type()
except exception.InvalidContentType:
msg = _("Unsupported Content-Type")
return Fault(webob.exc.HTTPUnsupportedMediaType(explanation=msg))
# NOTE(Vek): Splitting the function up this way allows for
# auditing by external tools that wrap the existing
# function. If we try to audit __call__(), we can

View File

@ -366,9 +366,8 @@ class ResourceTest(test.TestCase):
request.headers['Content-Type'] = 'application/none'
request.body = b'foo'
content_type, body = resource.get_body(request)
self.assertIsNone(content_type)
self.assertEqual('', body)
self.assertRaises(exception.InvalidContentType,
resource.get_body, request)
def test_get_body_no_content_type(self):
class Controller(object):

View File

@ -0,0 +1,5 @@
---
fixes:
- |
Cinder now will return 415 (HTTPUnsupportedMediaType) when any unsupported
content type is specified in request header.