summaryrefslogtreecommitdiff
path: root/paste/registry.py
diff options
context:
space:
mode:
authorbbangert <devnull@localhost>2008-04-06 03:15:39 +0000
committerbbangert <devnull@localhost>2008-04-06 03:15:39 +0000
commit6a1505e74d2f52ae89347eb8f1a8ec78ab825c93 (patch)
tree2c741f468ffbe7815bdcf1e27d64e5fa82a5d2d1 /paste/registry.py
parent10749266d3ae0188a2e61070690d8b50c0a99f2a (diff)
downloadpaste-6a1505e74d2f52ae89347eb8f1a8ec78ab825c93.tar.gz
Adding streaming iter option to Registry
Diffstat (limited to 'paste/registry.py')
-rw-r--r--paste/registry.py36
1 files changed, 35 insertions, 1 deletions
diff --git a/paste/registry.py b/paste/registry.py
index b261981..9100074 100644
--- a/paste/registry.py
+++ b/paste/registry.py
@@ -335,13 +335,17 @@ class RegistryManager(object):
object which is a Registry instance.
"""
- def __init__(self, application):
+ def __init__(self, application, streaming=False):
self.application = application
+ self.streaming = streaming
def __call__(self, environ, start_response):
app_iter = None
reg = environ.setdefault('paste.registry', Registry())
reg.prepare()
+ if self.streaming:
+ return self.streaming_iter(reg, environ, start_response)
+
try:
app_iter = self.application(environ, start_response)
except Exception, e:
@@ -370,6 +374,36 @@ class RegistryManager(object):
reg.cleanup()
return app_iter
+
+ def streaming_iter(self, reg, environ, start_response):
+ try:
+ for item in self.application(environ, start_response):
+ yield item
+ except Exception, e:
+ # Regardless of if the content is an iterable, generator, list
+ # or tuple, we clean-up right now. If its an iterable/generator
+ # care should be used to ensure the generator has its own ref
+ # to the actual object
+ if environ.get('paste.evalexception'):
+ # EvalException is present in the WSGI stack
+ expected = False
+ for expect in environ.get('paste.expected_exceptions', []):
+ if isinstance(e, expect):
+ expected = True
+ if not expected:
+ # An unexpected exception: save state for EvalException
+ restorer.save_registry_state(environ)
+ reg.cleanup()
+ raise
+ except:
+ # Save state for EvalException if it's present
+ if environ.get('paste.evalexception'):
+ restorer.save_registry_state(environ)
+ reg.cleanup()
+ raise
+ else:
+ reg.cleanup()
+
class StackedObjectRestorer(object):
"""Track StackedObjectProxies and their proxied objects for automatic