diff options
| author | ianb <devnull@localhost> | 2005-07-03 19:57:34 +0000 |
|---|---|---|
| committer | ianb <devnull@localhost> | 2005-07-03 19:57:34 +0000 |
| commit | e2a961a374281ff81f76f0e1b06350e088acb303 (patch) | |
| tree | 9c0a24f2c8436e532bc4f01eee3c7c93f45d0372 /paste/wareweb/servlet.py | |
| parent | b164c44549e6a129fca8369ebfae49630f881ecf (diff) | |
| download | paste-e2a961a374281ff81f76f0e1b06350e088acb303.tar.gz | |
Made event wrapping more subclassing-friendly; added foward_to_wsgiapp method; refactored to move main processing from __call__ to _process
Diffstat (limited to 'paste/wareweb/servlet.py')
| -rw-r--r-- | paste/wareweb/servlet.py | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/paste/wareweb/servlet.py b/paste/wareweb/servlet.py index 2a8d80a..469da96 100644 --- a/paste/wareweb/servlet.py +++ b/paste/wareweb/servlet.py @@ -10,6 +10,10 @@ from UserDict import UserDict __all__ = ['Servlet'] +class ForwardRequest(Exception): + def __init__(self, app): + self.application = app + class Servlet(object): app_name = 'app' @@ -34,11 +38,20 @@ class Servlet(object): value.__addtoclass__(attr, cls) def __call__(self, environ, start_response): + try: + status, headers, app_iter = self._process( + environ, start_response) + except ForwardRequest, e: + return e.application(environ, start_response) + else: + start_response(status, headers) + return app_iter + + def _process(self, environ, start_response): value = event.raise_event('call', self, environ, start_response) if value is not event.Continue: status, headers, app_iter = value - start_response(status, headers) - return app_iter + return status, headers, app_iter self.environ = environ self.config = self.environ['paste.config'] if self.config.get('app_name'): @@ -69,20 +82,17 @@ class Servlet(object): else: headers.append((name, value)) # @@: cookies - start_response(self.status, headers) - return self._cached_output + return self.status, headers, self._cached_output @event.wrap_func def run(self): __traceback_hide__ = 'before_and_this' try: - self.awake() - self.respond() + event.wrap_func(self.awake.im_func)(self) + event.wrap_func(self.respond.im_func)(self) finally: - self.sleep() - + event.wrap_func(self.sleep.im_func)(self) - @event.wrap_func def awake(self, call_setup=True): if call_setup: self.setup() @@ -90,11 +100,9 @@ class Servlet(object): def setup(self): pass - @event.wrap_func def respond(self): pass - @event.wrap_func def sleep(self, call_teardown=True): if call_teardown: self.teardown() @@ -187,4 +195,10 @@ class Servlet(object): "This resource has been redirected", headers={'Location': url}) + def forward_to_wsgiapp(self, app): + """ + Forwards the request to the given WSGI application + """ + raise ForwardRequest(app) + abs_regex = re.compile(r'^[a-zA-Z]:') |
