More details when logging 413 Entity Too Large

I spent a few days figuring out what was making the OS-FEDERATION
mapping rules create/update API calls return "413 Entity Too Large"
errors for our CentOS7/haproxy/apache/mod_wsgi/keystone/python2 setup.

To make this a bit easier for future users then I would like to include
max_request_body_size and its value in the response and also log the
error.

Retaining the "Request is too large." bit in the message is intended to
also make it easier to find where the limit is set.

Resulting log error in keystone looks like:

2019-07-04 06:52:13.217789 | ubuntu-bionic |  INFO
[oslo_middleware.sizelimit] Request is too large. Larger than
max_request_body_size (114688).

Change-Id: Ic66882afba25222ab8464ac9194c5002c8666db1
Closes-Bug: #1835363
Signed-off-by: Johan Guldmyr <johan.guldmyr@csc.fi>
This commit is contained in:
Johan Guldmyr 2019-07-04 09:11:44 +03:00
parent 7679e2057a
commit d6b74f5ce9
No known key found for this signature in database
GPG Key ID: B856C95D74525E1C
2 changed files with 13 additions and 3 deletions

View File

@ -17,6 +17,8 @@ Request Body limiting middleware.
"""
import logging
from oslo_config import cfg
import webob.dec
import webob.exc
@ -24,6 +26,8 @@ import webob.exc
from oslo_middleware._i18n import _
from oslo_middleware import base
LOG = logging.getLogger(__name__)
_oldopts = [cfg.DeprecatedOpt('osapi_max_request_body_size',
group='DEFAULT'),
@ -56,7 +60,7 @@ class LimitingReader(object):
for chunk in self.data:
self.bytes_read += len(chunk)
if self.bytes_read > self.limit:
msg = _("Request is too large.")
msg = _("Request is too large. Larger than %s") % self.limit
raise webob.exc.HTTPRequestEntityTooLarge(explanation=msg)
else:
yield chunk
@ -70,7 +74,7 @@ class LimitingReader(object):
result = self.data.read(i)
self.bytes_read += len(result)
if self.bytes_read > self.limit:
msg = _("Request is too large.")
msg = _("Request is too large. Larger than %s.") % self.limit
raise webob.exc.HTTPRequestEntityTooLarge(explanation=msg)
return result
@ -87,7 +91,9 @@ class RequestBodySizeLimiter(base.ConfigurableMiddleware):
max_size = self._conf_get('max_request_body_size')
if (req.content_length is not None and
req.content_length > max_size):
msg = _("Request is too large.")
msg = _("Request is too large. "
"Larger than max_request_body_size (%s).") % max_size
LOG.info(msg)
raise webob.exc.HTTPRequestEntityTooLarge(explanation=msg)
if req.content_length is None:
limiter = LimitingReader(req.body_file, max_size)

View File

@ -0,0 +1,4 @@
---
other:
- |
Log when max_request_body_size is exceeded.