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
This commit is contained in:
parent
6b85ba46c8
commit
163710cb1a
@ -93,14 +93,22 @@ class CeilometerMiddleware(object):
|
|||||||
start_response_args[0] = (status, list(headers), exc_info)
|
start_response_args[0] = (status, list(headers), exc_info)
|
||||||
|
|
||||||
def iter_response(iterable):
|
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]:
|
if start_response_args[0]:
|
||||||
start_response(*start_response_args[0])
|
start_response(*start_response_args[0])
|
||||||
bytes_sent = 0
|
bytes_sent = 0
|
||||||
try:
|
try:
|
||||||
for chunk in iterable:
|
while chunk:
|
||||||
if chunk:
|
bytes_sent += len(chunk)
|
||||||
bytes_sent += len(chunk)
|
|
||||||
yield chunk
|
yield chunk
|
||||||
|
chunk = iterator.next()
|
||||||
finally:
|
finally:
|
||||||
try:
|
try:
|
||||||
self.publish_sample(env,
|
self.publish_sample(env,
|
||||||
|
@ -39,13 +39,15 @@ class FakeApp(object):
|
|||||||
self.body = body
|
self.body = body
|
||||||
|
|
||||||
def __call__(self, env, start_response):
|
def __call__(self, env, start_response):
|
||||||
|
yield
|
||||||
start_response('200 OK', [
|
start_response('200 OK', [
|
||||||
('Content-Type', 'text/plain'),
|
('Content-Type', 'text/plain'),
|
||||||
('Content-Length', str(sum(map(len, self.body))))
|
('Content-Length', str(sum(map(len, self.body))))
|
||||||
])
|
])
|
||||||
while env['wsgi.input'].read(5):
|
while env['wsgi.input'].read(5):
|
||||||
pass
|
pass
|
||||||
return self.body
|
for line in self.body:
|
||||||
|
yield line
|
||||||
|
|
||||||
|
|
||||||
class TestSwiftMiddleware(tests_base.BaseTestCase):
|
class TestSwiftMiddleware(tests_base.BaseTestCase):
|
||||||
|
Loading…
Reference in New Issue
Block a user