Use sizelimit from oslo.middleware
Module sizelimit in nova and oslo.middleware is the same, so switch nova to use RequestBodySizalimiter from oslo.middleware lib Replace RequestBodySizalimiter and LimitingReader by temporal aliases of this classes in oslo.middleware due to failures in grenade jobs. Remove tests for this module Change-Id: I6296215857c2b16035c9081e13ac4345ed5c420a
This commit is contained in:
parent
4e63a3b34d
commit
9bf5c425ed
|
@ -99,7 +99,7 @@ paste.filter_factory = nova.api.openstack.auth:NoAuthMiddlewareV3.factory
|
|||
paste.filter_factory = nova.api.openstack.compute.limits:RateLimitingMiddleware.factory
|
||||
|
||||
[filter:sizelimit]
|
||||
paste.filter_factory = nova.api.sizelimit:RequestBodySizeLimiter.factory
|
||||
paste.filter_factory = oslo.middleware:RequestBodySizeLimiter.factory
|
||||
|
||||
[app:osapi_compute_app_v2]
|
||||
paste.app_factory = nova.api.openstack.compute:APIRouter.factory
|
||||
|
|
|
@ -15,68 +15,10 @@
|
|||
Request Body limiting middleware.
|
||||
|
||||
"""
|
||||
|
||||
from oslo.config import cfg
|
||||
import webob.dec
|
||||
import webob.exc
|
||||
|
||||
from nova.i18n import _
|
||||
from nova import wsgi
|
||||
from oslo.middleware import sizelimit
|
||||
|
||||
|
||||
# default request size is 112k
|
||||
max_request_body_size_opt = cfg.IntOpt('osapi_max_request_body_size',
|
||||
default=114688,
|
||||
help='The maximum body size '
|
||||
'per each osapi request(bytes)')
|
||||
|
||||
CONF = cfg.CONF
|
||||
CONF.register_opt(max_request_body_size_opt)
|
||||
|
||||
|
||||
class LimitingReader(object):
|
||||
"""Reader to limit the size of an incoming request."""
|
||||
def __init__(self, data, limit):
|
||||
"""Initialize a new `LimitingReader`.
|
||||
|
||||
:param data: underlying data object
|
||||
:param limit: maximum number of bytes the reader should allow
|
||||
"""
|
||||
self.data = data
|
||||
self.limit = limit
|
||||
self.bytes_read = 0
|
||||
|
||||
def __iter__(self):
|
||||
for chunk in self.data:
|
||||
self.bytes_read += len(chunk)
|
||||
if self.bytes_read > self.limit:
|
||||
msg = _("Request is too large.")
|
||||
raise webob.exc.HTTPRequestEntityTooLarge(explanation=msg)
|
||||
else:
|
||||
yield chunk
|
||||
|
||||
def read(self, i=None):
|
||||
result = self.data.read(i)
|
||||
self.bytes_read += len(result)
|
||||
if self.bytes_read > self.limit:
|
||||
msg = _("Request is too large.")
|
||||
raise webob.exc.HTTPRequestEntityTooLarge(explanation=msg)
|
||||
return result
|
||||
|
||||
|
||||
class RequestBodySizeLimiter(wsgi.Middleware):
|
||||
"""Limit the size of incoming requests."""
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(RequestBodySizeLimiter, self).__init__(*args, **kwargs)
|
||||
|
||||
@webob.dec.wsgify(RequestClass=wsgi.Request)
|
||||
def __call__(self, req):
|
||||
if req.content_length > CONF.osapi_max_request_body_size:
|
||||
msg = _("Request is too large.")
|
||||
raise webob.exc.HTTPRequestEntityTooLarge(explanation=msg)
|
||||
if req.content_length is None and req.is_body_readable:
|
||||
limiter = LimitingReader(req.body_file,
|
||||
CONF.osapi_max_request_body_size)
|
||||
req.body_file = limiter
|
||||
return self.application
|
||||
# TODO(ekudryashova): Remove below aliases when grenade jobs
|
||||
# will start upgrading from juno
|
||||
LimitingReader = sizelimit.LimitingReader
|
||||
RequestBodySizeLimiter = sizelimit.RequestBodySizeLimiter
|
||||
|
|
|
@ -1,101 +0,0 @@
|
|||
# Copyright (c) 2012 OpenStack Foundation
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import StringIO
|
||||
|
||||
from oslo.config import cfg
|
||||
import webob
|
||||
|
||||
import nova.api.sizelimit
|
||||
from nova import test
|
||||
|
||||
CONF = cfg.CONF
|
||||
MAX_REQUEST_BODY_SIZE = CONF.osapi_max_request_body_size
|
||||
|
||||
|
||||
class TestLimitingReader(test.NoDBTestCase):
|
||||
|
||||
def test_limiting_reader(self):
|
||||
BYTES = 1024
|
||||
bytes_read = 0
|
||||
data = StringIO.StringIO("*" * BYTES)
|
||||
for chunk in nova.api.sizelimit.LimitingReader(data, BYTES):
|
||||
bytes_read += len(chunk)
|
||||
|
||||
self.assertEqual(bytes_read, BYTES)
|
||||
|
||||
bytes_read = 0
|
||||
data = StringIO.StringIO("*" * BYTES)
|
||||
reader = nova.api.sizelimit.LimitingReader(data, BYTES)
|
||||
byte = reader.read(1)
|
||||
while len(byte) != 0:
|
||||
bytes_read += 1
|
||||
byte = reader.read(1)
|
||||
|
||||
self.assertEqual(bytes_read, BYTES)
|
||||
|
||||
def test_limiting_reader_fails(self):
|
||||
BYTES = 1024
|
||||
|
||||
def _consume_all_iter():
|
||||
bytes_read = 0
|
||||
data = StringIO.StringIO("*" * BYTES)
|
||||
for chunk in nova.api.sizelimit.LimitingReader(data, BYTES - 1):
|
||||
bytes_read += len(chunk)
|
||||
|
||||
self.assertRaises(webob.exc.HTTPRequestEntityTooLarge,
|
||||
_consume_all_iter)
|
||||
|
||||
def _consume_all_read():
|
||||
bytes_read = 0
|
||||
data = StringIO.StringIO("*" * BYTES)
|
||||
reader = nova.api.sizelimit.LimitingReader(data, BYTES - 1)
|
||||
byte = reader.read(1)
|
||||
while len(byte) != 0:
|
||||
bytes_read += 1
|
||||
byte = reader.read(1)
|
||||
|
||||
self.assertRaises(webob.exc.HTTPRequestEntityTooLarge,
|
||||
_consume_all_read)
|
||||
|
||||
|
||||
class TestRequestBodySizeLimiter(test.NoDBTestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(TestRequestBodySizeLimiter, self).setUp()
|
||||
|
||||
@webob.dec.wsgify()
|
||||
def fake_app(req):
|
||||
return webob.Response(req.body)
|
||||
|
||||
self.middleware = nova.api.sizelimit.RequestBodySizeLimiter(fake_app)
|
||||
self.request = webob.Request.blank('/', method='POST')
|
||||
|
||||
def test_content_length_acceptable(self):
|
||||
self.request.headers['Content-Length'] = MAX_REQUEST_BODY_SIZE
|
||||
self.request.body = "0" * MAX_REQUEST_BODY_SIZE
|
||||
response = self.request.get_response(self.middleware)
|
||||
self.assertEqual(response.status_int, 200)
|
||||
|
||||
def test_content_length_too_large(self):
|
||||
self.request.headers['Content-Length'] = MAX_REQUEST_BODY_SIZE + 1
|
||||
self.request.body = "0" * (MAX_REQUEST_BODY_SIZE + 1)
|
||||
response = self.request.get_response(self.middleware)
|
||||
self.assertEqual(response.status_int, 413)
|
||||
|
||||
def test_request_too_large_no_content_length(self):
|
||||
self.request.body = "0" * (MAX_REQUEST_BODY_SIZE + 1)
|
||||
self.request.headers['Content-Length'] = None
|
||||
response = self.request.get_response(self.middleware)
|
||||
self.assertEqual(response.status_int, 413)
|
Loading…
Reference in New Issue