Merge "Replace body_file with class to call uwsgi.chunked_read()"
This commit is contained in:
commit
51f1d8b543
@ -320,6 +320,14 @@ profiler_opts.set_defaults(CONF)
|
|||||||
|
|
||||||
ASYNC_EVENTLET_THREAD_POOL_LIST = []
|
ASYNC_EVENTLET_THREAD_POOL_LIST = []
|
||||||
|
|
||||||
|
# Detect if we're running under the uwsgi server
|
||||||
|
try:
|
||||||
|
import uwsgi
|
||||||
|
LOG.debug('Detected running under uwsgi')
|
||||||
|
except ImportError:
|
||||||
|
LOG.debug('Detected not running under uwsgi')
|
||||||
|
uwsgi = None
|
||||||
|
|
||||||
|
|
||||||
def get_num_workers():
|
def get_num_workers():
|
||||||
"""Return the configured number of workers."""
|
"""Return the configured number of workers."""
|
||||||
@ -925,6 +933,31 @@ class Router(object):
|
|||||||
return app
|
return app
|
||||||
|
|
||||||
|
|
||||||
|
class _UWSGIChunkFile(object):
|
||||||
|
|
||||||
|
def read(self, length=None):
|
||||||
|
position = 0
|
||||||
|
if length == 0:
|
||||||
|
return b""
|
||||||
|
|
||||||
|
if length and length < 0:
|
||||||
|
length = None
|
||||||
|
|
||||||
|
response = []
|
||||||
|
while True:
|
||||||
|
data = uwsgi.chunked_read()
|
||||||
|
# Return everything if we reached the end of the file
|
||||||
|
if not data:
|
||||||
|
break
|
||||||
|
response.append(data)
|
||||||
|
# Return the data if we've reached the length
|
||||||
|
if length is not None:
|
||||||
|
position += len(data)
|
||||||
|
if position >= length:
|
||||||
|
break
|
||||||
|
return b''.join(response)
|
||||||
|
|
||||||
|
|
||||||
class Request(webob.Request):
|
class Request(webob.Request):
|
||||||
"""Add some OpenStack API-specific logic to the base webob.Request."""
|
"""Add some OpenStack API-specific logic to the base webob.Request."""
|
||||||
|
|
||||||
@ -935,6 +968,19 @@ class Request(webob.Request):
|
|||||||
environ['wsgi.url_scheme'] = scheme
|
environ['wsgi.url_scheme'] = scheme
|
||||||
super(Request, self).__init__(environ, *args, **kwargs)
|
super(Request, self).__init__(environ, *args, **kwargs)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def body_file(self):
|
||||||
|
if uwsgi:
|
||||||
|
if self.headers.get('transfer-encoding', '').lower() == 'chunked':
|
||||||
|
return _UWSGIChunkFile()
|
||||||
|
return super(Request, self).body_file
|
||||||
|
|
||||||
|
@body_file.setter
|
||||||
|
def body_file(self, value):
|
||||||
|
# NOTE(cdent): If you have a property setter in a superclass, it will
|
||||||
|
# not be inherited.
|
||||||
|
webob.Request.body_file.fset(self, value)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def params(self):
|
def params(self):
|
||||||
"""Override params property of webob.request.BaseRequest.
|
"""Override params property of webob.request.BaseRequest.
|
||||||
|
@ -738,3 +738,68 @@ class GetSocketTestCase(test_utils.BaseTestCase):
|
|||||||
'glance.common.wsgi.ssl.wrap_socket',
|
'glance.common.wsgi.ssl.wrap_socket',
|
||||||
lambda *x, **y: None))
|
lambda *x, **y: None))
|
||||||
self.assertRaises(wsgi.socket.error, wsgi.get_socket, 1234)
|
self.assertRaises(wsgi.socket.error, wsgi.get_socket, 1234)
|
||||||
|
|
||||||
|
|
||||||
|
def _cleanup_uwsgi():
|
||||||
|
wsgi.uwsgi = None
|
||||||
|
|
||||||
|
|
||||||
|
class Test_UwsgiChunkedFile(test_utils.BaseTestCase):
|
||||||
|
|
||||||
|
def test_read_no_data(self):
|
||||||
|
reader = wsgi._UWSGIChunkFile()
|
||||||
|
wsgi.uwsgi = mock.MagicMock()
|
||||||
|
self.addCleanup(_cleanup_uwsgi)
|
||||||
|
|
||||||
|
def fake_read():
|
||||||
|
return None
|
||||||
|
|
||||||
|
wsgi.uwsgi.chunked_read = fake_read
|
||||||
|
out = reader.read()
|
||||||
|
self.assertEqual(out, b'')
|
||||||
|
|
||||||
|
def test_read_data_no_length(self):
|
||||||
|
reader = wsgi._UWSGIChunkFile()
|
||||||
|
wsgi.uwsgi = mock.MagicMock()
|
||||||
|
self.addCleanup(_cleanup_uwsgi)
|
||||||
|
|
||||||
|
values = iter([b'a', b'b', b'c', None])
|
||||||
|
|
||||||
|
def fake_read():
|
||||||
|
return next(values)
|
||||||
|
|
||||||
|
wsgi.uwsgi.chunked_read = fake_read
|
||||||
|
out = reader.read()
|
||||||
|
self.assertEqual(out, b'abc')
|
||||||
|
|
||||||
|
def test_read_zero_length(self):
|
||||||
|
reader = wsgi._UWSGIChunkFile()
|
||||||
|
self.assertEqual(b'', reader.read(length=0))
|
||||||
|
|
||||||
|
def test_read_data_length(self):
|
||||||
|
reader = wsgi._UWSGIChunkFile()
|
||||||
|
wsgi.uwsgi = mock.MagicMock()
|
||||||
|
self.addCleanup(_cleanup_uwsgi)
|
||||||
|
|
||||||
|
values = iter([b'a', b'b', b'c', None])
|
||||||
|
|
||||||
|
def fake_read():
|
||||||
|
return next(values)
|
||||||
|
|
||||||
|
wsgi.uwsgi.chunked_read = fake_read
|
||||||
|
out = reader.read(length=2)
|
||||||
|
self.assertEqual(out, b'ab')
|
||||||
|
|
||||||
|
def test_read_data_negative_length(self):
|
||||||
|
reader = wsgi._UWSGIChunkFile()
|
||||||
|
wsgi.uwsgi = mock.MagicMock()
|
||||||
|
self.addCleanup(_cleanup_uwsgi)
|
||||||
|
|
||||||
|
values = iter([b'a', b'b', b'c', None])
|
||||||
|
|
||||||
|
def fake_read():
|
||||||
|
return next(values)
|
||||||
|
|
||||||
|
wsgi.uwsgi.chunked_read = fake_read
|
||||||
|
out = reader.read(length=-2)
|
||||||
|
self.assertEqual(out, b'abc')
|
||||||
|
Loading…
Reference in New Issue
Block a user