From d6b74f5ce9af172d0b3a33234b1489d9af59e5fe Mon Sep 17 00:00:00 2001 From: Johan Guldmyr Date: Thu, 4 Jul 2019 09:11:44 +0300 Subject: [PATCH] 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 --- oslo_middleware/sizelimit.py | 12 +++++++++--- ...x_request_body_size-1835363-6f37946210a100d7.yaml | 4 ++++ 2 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 releasenotes/notes/log_max_request_body_size-1835363-6f37946210a100d7.yaml diff --git a/oslo_middleware/sizelimit.py b/oslo_middleware/sizelimit.py index 026b709..4156449 100644 --- a/oslo_middleware/sizelimit.py +++ b/oslo_middleware/sizelimit.py @@ -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) diff --git a/releasenotes/notes/log_max_request_body_size-1835363-6f37946210a100d7.yaml b/releasenotes/notes/log_max_request_body_size-1835363-6f37946210a100d7.yaml new file mode 100644 index 0000000..864d2ed --- /dev/null +++ b/releasenotes/notes/log_max_request_body_size-1835363-6f37946210a100d7.yaml @@ -0,0 +1,4 @@ +--- +other: + - | + Log when max_request_body_size is exceeded.