From c14ebd668f00b1d0c0f3c94fa331b2080d5ec053 Mon Sep 17 00:00:00 2001 From: Jamie Lennox Date: Wed, 9 Oct 2013 11:49:58 +1000 Subject: [PATCH] Don't use default value in LimitingReader We can't simply pass the None default on to the read operation as this default is handled differently between different wsgi implementations. Change-Id: I337e797b8dee3dfcf9299fe361cf197a176c8fe2 Fixes: bug 1213106 --- keystone/common/utils.py | 7 ++++++- keystone/tests/test_utils.py | 23 +++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/keystone/common/utils.py b/keystone/common/utils.py index b5dc85b384..402f8a2c55 100644 --- a/keystone/common/utils.py +++ b/keystone/common/utils.py @@ -290,7 +290,12 @@ def __iter__(self): yield chunk def read(self, i=None): - result = self.data.read(i) + # NOTE(jamielennox): We can't simply provide the default to the read() + # call as the expected default differs between mod_wsgi and eventlet + if i is None: + result = self.data.read() + else: + result = self.data.read(i) self.bytes_read += len(result) if self.bytes_read > self.limit: raise exception.RequestTooLarge() diff --git a/keystone/tests/test_utils.py b/keystone/tests/test_utils.py index c28ca502ff..a71ec690cd 100644 --- a/keystone/tests/test_utils.py +++ b/keystone/tests/test_utils.py @@ -105,3 +105,26 @@ def _test_unixtime(): for d in ['+0', '-11', '-8', '-5', '+5', '+8', '+14']: TZ = 'UTC' + d _test_unixtime() + + +class LimitingReaderTests(tests.TestCase): + + def test_read_default_value(self): + + class FakeData(object): + def read(self, *args, **kwargs): + self.read_args = args + self.read_kwargs = kwargs + return 'helloworld' + + data = FakeData() + utils.LimitingReader(data, 100) + + self.assertEqual(data.read(), 'helloworld') + self.assertEqual(len(data.read_args), 0) + self.assertEqual(len(data.read_kwargs), 0) + + self.assertEqual(data.read(10), 'helloworld') + self.assertEqual(len(data.read_args), 1) + self.assertEqual(len(data.read_kwargs), 0) + self.assertEqual(data.read_args[0], 10)