Don't send session cookie unless session is dirty.
[wrw.git] / wrw / session.py
index 513725d..9e91ad9 100644 (file)
@@ -76,7 +76,6 @@ class db(object):
         self.cookiename = cookiename
         self.path = path
         self.lock = threading.Lock()
-        self.lastuse = 0
         self.cthread = None
         self.freezetime = 3600
 
@@ -99,18 +98,17 @@ class db(object):
 
     def cleanloop(self):
         try:
-            lastuse = self.lastuse
-            while self.lastuse >= lastuse:
-                lastuse = self.lastuse
+            while True:
                 time.sleep(300)
                 self.clean()
+                if len(self.live) == 0:
+                    break
         finally:
             with self.lock:
                 self.cthread = None
 
     def fetch(self, req):
         now = int(time.time())
-        self.lastuse = now
         sessid = cookie.get(req, self.cookiename)
         with self.lock:
             if self.cthread is None:
@@ -131,18 +129,17 @@ class db(object):
             except KeyError:
                 sess = session()
                 self.live[sess.id] = sess
-                req.oncommit(self.addcookie)
+                sess.new = True
         req.oncommit(self.ckfreeze)
         return sess
 
-    def addcookie(self, req):
-        sess = req.item(self.fetch)
-        cookie.add(req, self.cookiename, sess.id, self.path)
-
     def ckfreeze(self, req):
         sess = req.item(self.fetch)
         if sess.dirty():
             try:
+                if getattr(sess, "new", False):
+                    cookie.add(req, self.cookiename, sess.id, self.path)
+                    del sess.new
                 self.freeze(sess)
             except:
                 pass