<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>lib/jack/session.js</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -1,17 +1,21 @@
 var util = require(&quot;util&quot;),
-        Request = require(&quot;jack/request&quot;).Request,
-        Response = require(&quot;jack/response&quot;).Response,
-        sha = require(&quot;sha&quot;),
-        HashP = require(&quot;hashp&quot;).HashP;
+    Request = require(&quot;jack/request&quot;).Request,
+    Response = require(&quot;jack/response&quot;).Response,
+    sha = require(&quot;sha&quot;),
+    HashP = require(&quot;hashp&quot;).HashP;
+
+var loadSession = function(env){
+    var options = env[&quot;jsgi.session.options&quot;],
+        key = options.key,
+        secret = options.secret;
 
-var loadSession = function(env, key, secret){
     var req = new Request(env);
     var cookie = req.cookies()[key];
 
     if (cookie){
-        var cookieParts = decodeURIComponent(cookie).split(&quot;--&quot;);
-        var digest = cookieParts[1];
-        var sessionData = cookieParts[0];
+        var parts = decodeURIComponent(cookie).split(&quot;--&quot;),
+            digest = env[&quot;jsgi.session.digest&quot;] = parts[1];
+            sessionData = parts[0];
 
         if (digest == sha.hash(sessionData + secret).decodeToString(64))  {
             return JSON.parse(sessionData);
@@ -28,10 +32,12 @@ var commitSession = function(env, jsgiResponse, key, secret){
 
     var sessionData = JSON.stringify(session);
 
-    if (secret){
-        var digest = sha.hash(sessionData + secret).decodeToString(64);
-        sessionData = sessionData + &quot;--&quot; + digest;
-    }
+    var digest = sha.hash(sessionData + secret).decodeToString(64);
+
+    // do not serialize if the session is not dirty.
+    if (digest == env[&quot;jsgi.session.digest&quot;]) return jsgiResponse;
+
+    sessionData = sessionData + &quot;--&quot; + digest;
 
     if (sessionData.length &gt; 4096) {
         env[&quot;jsgi.errors&quot;] += &quot;Session Cookie data size exceeds 4k!  Content dropped&quot;;
@@ -50,27 +56,31 @@ var commitSession = function(env, jsgiResponse, key, secret){
     return response;
 }
 
+/**
+ * Cookie Session Store middleware.
+ * Does not implicitly deserialize the session, only serializes the session if
+ * dirty.
+ */
 var Cookie = exports.Cookie = function(app, options) {
     options = options || {};
     util.update(options, /* default options */ {
+        key: &quot;jsgi.session&quot;,
         domain: null,
         path: &quot;/&quot;,
         expire_after: null
     });
 
-    var key = options.key || &quot;jsgi.session&quot;,
-            secret = options.secret;
+    if (!options.secret) throw new Error(&quot;Session secret not defined&quot;);
+
+    var key = options.key,
+        secret = options.secret;
 
     return function(env) {
-        try {
-            env[&quot;jsgi.session&quot;] = loadSession(env, key, secret);
-        } catch (err) {
-            env[&quot;jsgi.session&quot;] = {};
-        }
+        env[&quot;jsgi.session.loadSession&quot;] = loadSession;
         env[&quot;jsgi.session.options&quot;] = options;
 
         var jsgiResponse = app(env);
 
         return commitSession(env, jsgiResponse, key, secret);
     }
-}
\ No newline at end of file
+}</diff>
      <filename>lib/jack/session/cookie.js</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>87dd60189eb6996da0bbfe906494145f2113c0cb</id>
    </parent>
  </parents>
  <author>
    <name>George Moschovitis</name>
    <email>george.moschovitis@gmail.com</email>
  </author>
  <url>http://github.com/gmosx/jack/commit/18179f6f79bc59b6d5f01680ea03c1dc9554d279</url>
  <id>18179f6f79bc59b6d5f01680ea03c1dc9554d279</id>
  <committed-date>2009-10-16T18:19:22-07:00</committed-date>
  <authored-date>2009-10-13T03:14:30-07:00</authored-date>
  <message>Improved session middleware: explicit deserialization, serialization if dirty.
Introduced Session.</message>
  <tree>c287c347b7bb56a928b9fdfd310393ba28c2d758</tree>
  <committer>
    <name>Tom Robinson</name>
    <email>tom@280north.com</email>
  </committer>
</commit>
