Merge "API: accept None as content-length in HTTP requests"

This commit is contained in:
Jenkins
2017-04-05 20:23:05 +00:00
committed by Gerrit Code Review
2 changed files with 21 additions and 7 deletions

View File

@@ -625,13 +625,7 @@ class Resource(wsgi.Application):
# Now, deserialize the request body...
try:
contents = {}
if self._should_have_body(request):
# allow empty body with PUT and POST
if request.content_length == 0:
contents = {'body': None}
else:
contents = self.deserialize(body)
contents = self._get_request_content(body, request)
except exception.MalformedRequestBody:
msg = _("Malformed request body")
return Fault(webob.exc.HTTPBadRequest(explanation=msg))
@@ -699,6 +693,16 @@ class Resource(wsgi.Application):
return response
def _get_request_content(self, body, request):
contents = {}
if self._should_have_body(request):
# allow empty body with PUT and POST
if request.content_length == 0 or request.content_length is None:
contents = {'body': None}
else:
contents = self.deserialize(body)
return contents
def get_method(self, request, action, content_type, body):
meth, extensions = self._get_method(request,
action,

View File

@@ -592,6 +592,16 @@ class ResourceTest(MicroversionedTest):
self.assertEqual('application/json', content_type)
self.assertEqual(b'', body)
def test_get_body_content_body_none(self):
resource = wsgi.Resource(None)
request = wsgi.Request.blank('/', method='PUT')
body = None
contents = resource._get_request_content(body, request)
self.assertIn('body', contents)
self.assertIsNone(contents['body'])
def test_get_body(self):
class Controller(object):
def index(self, req, pants=None):