summaryrefslogtreecommitdiff
path: root/paste/session.py
diff options
context:
space:
mode:
authorianb <devnull@localhost>2006-06-21 04:26:25 +0000
committerianb <devnull@localhost>2006-06-21 04:26:25 +0000
commit16bf2b6740697c756bcd9f20cb39f8df4dd2c5eb (patch)
tree5b855df465bc8e19f08f7b2baccbe1ddba6093bc /paste/session.py
parent244e7f73d363515254abda722ab2a90b46533412 (diff)
downloadpaste-16bf2b6740697c756bcd9f20cb39f8df4dd2c5eb.tar.gz
Made it possible to create the session after start_response is called but before the first content is sent to the server
Diffstat (limited to 'paste/session.py')
-rw-r--r--paste/session.py19
1 files changed, 15 insertions, 4 deletions
diff --git a/paste/session.py b/paste/session.py
index b10601f..c2feac6 100644
--- a/paste/session.py
+++ b/paste/session.py
@@ -42,18 +42,29 @@ class SessionMiddleware(object):
def __call__(self, environ, start_response):
session_factory = SessionFactory(environ, **self.factory_kw)
environ['paste.session.factory'] = session_factory
+ remember_headers = []
def session_start_response(status, headers, exc_info=None):
if not session_factory.created:
+ remember_headers[:] = [status, headers]
return start_response(status, headers)
headers.append(session_factory.set_cookie_header())
return start_response(status, headers, exc_info)
app_iter = self.application(environ, session_start_response)
- if session_factory.used:
- return wsgilib.add_close(app_iter, session_factory.close)
- else:
- return app_iter
+ def start():
+ if session_factory.created and remember_headers:
+ # Tricky bastard used the session after start_response
+ status, headers = remember_headers
+ headers.append(session_factory.set_cookie_header())
+ exc = ValueError(
+ "You cannot get the session after content from the "
+ "app_iter has been returned")
+ start_response(status, headers, (exc.__class__, exc, None))
+ def close():
+ if session_factory.used:
+ session_factory.close()
+ return wsgilib.add_start_close(app_iter, start, close)
class SessionFactory(object):