summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMehdi Abaakouk <mehdi.abaakouk@enovance.com>2014-06-03 18:46:06 +0200
committerHisashi Osanai <osanai.hisashi@jp.fujitsu.com>2014-08-08 18:08:22 +0900
commitc837d83e752d979194e3721f6047b722106c5569 (patch)
tree03b6cd837a6f9321716be3917607c59265fd6326
parentea457c6a306abf53b29bec3e1dd8b42d2c88cbf7 (diff)
downloadceilometer-c837d83e752d979194e3721f6047b722106c5569.tar.gz
Iterates swift response earlier to get the correct status
We must iterate the next middleware app until we get a response before asking for the headers and status. Closes-bug: #1326250 Change-Id: I8947bc88754db93e3ebe01ea864c4b489d1bd870 (cherry picked from commit 163710cb1abc602b15d2a3b49aa52f3f7c84a65a)
-rw-r--r--ceilometer/objectstore/swift_middleware.py14
-rw-r--r--ceilometer/tests/objectstore/test_swift_middleware.py4
2 files changed, 14 insertions, 4 deletions
diff --git a/ceilometer/objectstore/swift_middleware.py b/ceilometer/objectstore/swift_middleware.py
index 10431840..3d75b35e 100644
--- a/ceilometer/objectstore/swift_middleware.py
+++ b/ceilometer/objectstore/swift_middleware.py
@@ -93,14 +93,22 @@ class CeilometerMiddleware(object):
start_response_args[0] = (status, list(headers), exc_info)
def iter_response(iterable):
+ iterator = iter(iterable)
+ try:
+ chunk = iterator.next()
+ while not chunk:
+ chunk = iterator.next()
+ except StopIteration:
+ chunk = ''
+
if start_response_args[0]:
start_response(*start_response_args[0])
bytes_sent = 0
try:
- for chunk in iterable:
- if chunk:
- bytes_sent += len(chunk)
+ while chunk:
+ bytes_sent += len(chunk)
yield chunk
+ chunk = iterator.next()
finally:
try:
self.publish_sample(env,
diff --git a/ceilometer/tests/objectstore/test_swift_middleware.py b/ceilometer/tests/objectstore/test_swift_middleware.py
index 7f3e0084..3a70bb11 100644
--- a/ceilometer/tests/objectstore/test_swift_middleware.py
+++ b/ceilometer/tests/objectstore/test_swift_middleware.py
@@ -34,13 +34,15 @@ class FakeApp(object):
self.body = body
def __call__(self, env, start_response):
+ yield
start_response('200 OK', [
('Content-Type', 'text/plain'),
('Content-Length', str(sum(map(len, self.body))))
])
while env['wsgi.input'].read(5):
pass
- return self.body
+ for line in self.body:
+ yield line
class TestSwiftMiddleware(test.BaseTestCase):