summaryrefslogtreecommitdiff
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
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
-rw-r--r--paste/session.py19
-rw-r--r--tests/test_session.py52
2 files changed, 67 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):
diff --git a/tests/test_session.py b/tests/test_session.py
new file mode 100644
index 0000000..621d284
--- /dev/null
+++ b/tests/test_session.py
@@ -0,0 +1,52 @@
+from paste.session import SessionMiddleware
+from paste.fixture import TestApp
+
+info = []
+
+def wsgi_app(environ, start_response):
+ pi = environ.get('PATH_INFO', '')
+ if pi in ('/get1', '/get2'):
+ if pi == '/get1':
+ sess = environ['paste.session.factory']()
+ start_response('200 OK', [('content-type', 'text/plain')])
+ if pi == '/get2':
+ sess = environ['paste.session.factory']()
+ if 'info' in sess:
+ return [str(sess['info'])]
+ else:
+ return ['no-info']
+ if pi in ('/put1', '/put2'):
+ if pi == '/put1':
+ sess = environ['paste.session.factory']()
+ sess['info'] = info[0]
+ start_response('200 OK', [('content-type', 'text/plain')])
+ if pi == '/put2':
+ sess = environ['paste.session.factory']()
+ sess['info'] = info[0]
+ return ['foo']
+
+wsgi_app = SessionMiddleware(wsgi_app)
+
+def test_app1():
+ app = TestApp(wsgi_app)
+ res = app.get('/get1')
+ assert res.body == 'no-info'
+ res = app.get('/get2')
+ assert res.body == 'no-info'
+ info[:] = ['test']
+ res = app.get('/put1')
+ res = app.get('/get1')
+ assert res.body == 'test'
+ res = app.get('/get2')
+ assert res.body == 'test'
+
+def test_app2():
+ app = TestApp(wsgi_app)
+ info[:] = ['fluff']
+ res = app.get('/put2')
+ res = app.get('/get1')
+ assert res.body == 'fluff'
+ res = app.get('/get2')
+ assert res.body == 'fluff'
+
+