From 435342c09cef2f0022cb6189dd4266c1c1a41186 Mon Sep 17 00:00:00 2001
From: Lloyd Hilaiel <lloyd@hilaiel.com>
Date: Tue, 14 Jun 2011 14:13:24 -0600
Subject: [PATCH] move off in-tree cookie-sessions now that upstream accepted
 our patches

---
 README.md                                     |   2 +-
 node_modules/README.md                        |   5 -
 node_modules/cookie-sessions/.gitmodules      |   3 -
 node_modules/cookie-sessions/LICENSE          |  19 -
 node_modules/cookie-sessions/README.md        |  47 --
 node_modules/cookie-sessions/index.js         |   3 -
 .../cookie-sessions/lib/cookie-sessions.js    | 224 -------
 node_modules/cookie-sessions/package.json     |  16 -
 node_modules/cookie-sessions/test.js          |  22 -
 .../test/test-cookie-sessions.js              | 620 ------------------
 10 files changed, 1 insertion(+), 960 deletions(-)
 delete mode 100644 node_modules/README.md
 delete mode 100644 node_modules/cookie-sessions/.gitmodules
 delete mode 100644 node_modules/cookie-sessions/LICENSE
 delete mode 100644 node_modules/cookie-sessions/README.md
 delete mode 100644 node_modules/cookie-sessions/index.js
 delete mode 100644 node_modules/cookie-sessions/lib/cookie-sessions.js
 delete mode 100644 node_modules/cookie-sessions/package.json
 delete mode 100755 node_modules/cookie-sessions/test.js
 delete mode 100644 node_modules/cookie-sessions/test/test-cookie-sessions.js

diff --git a/README.md b/README.md
index 65abfacbf..98d2494fd 100644
--- a/README.md
+++ b/README.md
@@ -10,7 +10,7 @@ All of the servers here are based on node.js, and some number of 3rd party node
 * xml2js (>= 0.1.5)
 * sqlite (>= 1.0.3)
 * mustache (>= 0.3.1)
-* cookie-sessions (patched version included in-tree, nothing to be done)
+* cookie-sessions (>= 0.0.2)
 
 ## Getting started:
 
diff --git a/node_modules/README.md b/node_modules/README.md
deleted file mode 100644
index 71a00cdf9..000000000
--- a/node_modules/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-Here live first and third party re-usable modules for node.
-
-* cookie-sessions - encrypted cookie based session storage (will a less stateful
-  server make), forked and improved, thus included inline here.  Original work:
-  https://github.com/caolan/cookie-sessions
diff --git a/node_modules/cookie-sessions/.gitmodules b/node_modules/cookie-sessions/.gitmodules
deleted file mode 100644
index 3b655320c..000000000
--- a/node_modules/cookie-sessions/.gitmodules
+++ /dev/null
@@ -1,3 +0,0 @@
-[submodule "deps/nodeunit"]
-	path = deps/nodeunit
-	url = git://github.com/caolan/nodeunit.git
diff --git a/node_modules/cookie-sessions/LICENSE b/node_modules/cookie-sessions/LICENSE
deleted file mode 100644
index b7f9d5001..000000000
--- a/node_modules/cookie-sessions/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2010 Caolan McMahon
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/node_modules/cookie-sessions/README.md b/node_modules/cookie-sessions/README.md
deleted file mode 100644
index 9ba215e56..000000000
--- a/node_modules/cookie-sessions/README.md
+++ /dev/null
@@ -1,47 +0,0 @@
-# Cookie-Sessions
-
-Secure cookie-based session middleware for
-[Connect](http://github.com/senchalabs/connect). This is a new module and I
-wouldn't recommend for production use just yet.
-
-Session data is stored on the request object in the 'session' property:
-
-    var connect = require('connect'),
-        sessions = require('cookie-sessions');
-
-    Connect.createServer(
-        sessions({secret: '123abc'}),
-        function(req, res, next){
-            req.session = {'hello':'world'};
-            res.writeHead(200, {'Content-Type':'text/plain'});
-            res.end('session data updated');
-        }
-    ).listen(8080);
-
-The session data is JSON.stringified, encrypted and timestamped, then a HMAC
-signature is attached to test for tampering. The main function accepts a
-number of options:
-
-    * secret -- The secret to encrypt the session data with
-    * timeout -- The amount of time in miliseconds before the cookie expires
-      (default: 24 hours)
-    * session_key -- The cookie key name to store the session data in
-      (default: _node)
-
-
-## Why store session data in cookies?
-
-* Its fast, you don't need to hit the filesystem or a database to look up
-  session data
-* It scales easily. You don't need to worry about sticky-sessions when
-  load-balancing across multiple nodes.
-* No server-side persistence requirements
-
-## Caveats
-
-* You can only store 4k of data in a cookie
-* Higher-bandwidth requirements, since the cookie is sent to the server with
-  every request.
-
-__In summary:__ don't use cookie storage if you keep a lot of data in your
-sessions!
diff --git a/node_modules/cookie-sessions/index.js b/node_modules/cookie-sessions/index.js
deleted file mode 100644
index 888d419ab..000000000
--- a/node_modules/cookie-sessions/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-// This file is just added for convenience so this repository can be
-// directly checked out into a project's deps folder
-module.exports = require('./lib/cookie-sessions');
diff --git a/node_modules/cookie-sessions/lib/cookie-sessions.js b/node_modules/cookie-sessions/lib/cookie-sessions.js
deleted file mode 100644
index 29dd8a2b5..000000000
--- a/node_modules/cookie-sessions/lib/cookie-sessions.js
+++ /dev/null
@@ -1,224 +0,0 @@
-var crypto = require('crypto');
-var url = require('url');
-
-var exports = module.exports = function(settings){
-
-    var default_settings = {
-        // don't set a default cookie secret, must be explicitly defined
-        session_key: '_node',
-        timeout: 1000 * 60 * 60 * 24, // 24 hours
-        path: '/'
-    };
-    var s = extend(default_settings, settings);
-    if(!s.secret) throw new Error('No secret set in cookie-session settings');
-
-    if(typeof s.path !== 'string' || s.path.indexOf('/') != 0)
-        throw new Error('invalid cookie path, must start with "/"');
-
-    return function(req, res, next){
-        // if the request is not under the specified path, do nothing.
-        if (url.parse(req.url).pathname.indexOf(s.path) != 0) {
-            next();
-            return;
-        }
-
-        // Read session data from a request and store it in req.session
-        var bad_cookie = false;
-        try {
-            req.session = exports.readSession(
-                s.session_key, s.secret, s.timeout, req);
-        } catch(e) {
-            console.log("bad cookie: " + e);
-            bad_cookie = true;
-        }
-
-        // proxy writeHead to add cookie to response
-        var _writeHead = res.writeHead;
-        res.writeHead = function(statusCode){
-
-            var reasonPhrase, headers;
-            if (typeof arguments[1] === 'string') {
-                reasonPhrase = arguments[1];
-                headers = arguments[2] || {};
-            }
-            else {
-                headers = arguments[1] || {};
-            }
-
-            // Add a Set-Cookie header to all responses with the session data
-            // and the current timestamp. The cookie needs to be set on every
-            // response so that the timestamp is up to date, and the session
-            // does not expire unless the user is inactive.
-
-            var cookiestr;
-            if (req.session === undefined) {
-                if ("cookie" in req.headers) {
-                    cookiestr = escape(s.session_key) + '='
-                        + '; expires=' + exports.expires(0)
-                        + '; path=' + s.path;
-                }
-            } else {
-                cookiestr = escape(s.session_key) + '='
-                    + escape(exports.serialize(s.secret, req.session))
-                    + '; expires=' + exports.expires(s.timeout)
-                    + '; path=' + s.path;
-            }
-            
-            if (cookiestr !== undefined) {
-                if(Array.isArray(headers)) headers.push(['Set-Cookie', cookiestr]);
-                else {
-                    // if a Set-Cookie header already exists, convert headers to
-                    // array so we can send multiple Set-Cookie headers.
-                    if(headers['Set-Cookie'] !== undefined){
-                        headers = exports.headersToArray(headers);
-                        headers.push(['Set-Cookie', cookiestr]);
-                    }
-                    // if no Set-Cookie header exists, leave the headers as an
-                    // object, and add a Set-Cookie property
-                    else {
-                        headers['Set-Cookie'] = cookiestr;
-                    }
-                }
-            }
-
-            var args = [statusCode, reasonPhrase, headers];
-            if (!args[1]) {
-                args.splice(1, 1);
-            }
-            // call the original writeHead on the request
-            return _writeHead.apply(res, args);
-        }
-        next();
-
-    };
-};
-
-exports.headersToArray = function(headers){
-    if(Array.isArray(headers)) return headers;
-    return Object.keys(headers).reduce(function(arr, k){
-        arr.push([k, headers[k]]);
-        return arr;
-    }, []);
-};
-
-
-// Extend a given object with all the properties in passed-in object(s).
-// From underscore.js (http://documentcloud.github.com/underscore/)
-function extend(obj) {
-    Array.prototype.slice.call(arguments).forEach(function(source) {
-      for (var prop in source) obj[prop] = source[prop];
-    });
-    return obj;
-};
-
-exports.deserialize = function(secret, timeout, str){
-    // Parses a secure cookie string, returning the object stored within it.
-    // Throws an exception if the secure cookie string does not validate.
-
-    if(!exports.valid(secret, timeout, str)){
-        throw new Error('invalid cookie');
-    }
-    var data = exports.decrypt(secret, exports.split(str).data_blob);
-    return JSON.parse(data);
-};
-
-exports.serialize = function(secret, data){
-    // Turns a JSON-compatibile object literal into a secure cookie string
-
-    var data_str = JSON.stringify(data);
-    var data_enc = exports.encrypt(secret, data_str);
-    var timestamp = (new Date()).getTime();
-    var hmac_sig = exports.hmac_signature(secret, timestamp, data_enc);
-    var result = hmac_sig + timestamp + data_enc;
-    if(!exports.checkLength(result)){
-        throw new Error('data too long to store in a cookie');
-    }
-    return result;
-};
-
-exports.split = function(str){
-    // Splits a cookie string into hmac signature, timestamp and data blob.
-    return {
-        hmac_signature: str.slice(0,40),
-        timestamp: parseInt(str.slice(40, 53), 10),
-        data_blob: str.slice(53)
-    };
-};
-
-exports.hmac_signature = function(secret, timestamp, data){
-    // Generates a HMAC for the timestamped data, returning the
-    // hex digest for the signature.
-    var hmac = crypto.createHmac('sha1', secret);
-    hmac.update(timestamp + data);
-    return hmac.digest('hex');
-};
-
-exports.valid = function(secret, timeout, str){
-    // Tests the validity of a cookie string. Returns true if the HMAC
-    // signature of the secret, timestamp and data blob matches the HMAC in the
-    // cookie string, and the cookie's age is less than the timeout value.
-
-    var parts = exports.split(str);
-    var hmac_sig = exports.hmac_signature(
-        secret, parts.timestamp, parts.data_blob
-    );
-    return (
-        parts.hmac_signature === hmac_sig &&
-        parts.timestamp + timeout > new Date().getTime()
-    );
-};
-
-exports.decrypt = function(secret, str){
-    // Decrypt the aes192 encoded str using secret.
-    var decipher = crypto.createDecipher("aes192", secret);
-    return decipher.update(str, 'hex', 'utf8') + decipher.final('utf8');
-};
-
-exports.encrypt = function(secret, str){
-    // Encrypt the str with aes192 using secret.
-    var cipher = crypto.createCipher("aes192", secret);
-    return cipher.update(str, 'utf8', 'hex') + cipher.final('hex');
-};
-
-exports.checkLength = function(str){
-    // Test if a string is within the maximum length allowed for a cookie.
-    return str.length <= 4096;
-};
-
-exports.readCookies = function(req){
-    // if "cookieDecoder" is in use, then req.cookies
-    // will already contain the parsed cookies
-    if (req.cookies) {
-        return req.cookies;
-    }
-    else {
-        // Extracts the cookies from a request object.
-        var cookie = req.headers.cookie;
-        if(!cookie){
-            return {};
-        }
-        var parts = cookie.split(/\s*;\s*/g).map(function(x){
-            return x.split('=');
-        });
-        return parts.reduce(function(a, x){
-            a[unescape(x[0])] = unescape(x[1]);
-            return a;
-        }, {});
-    }
-};
-
-exports.readSession = function(key, secret, timeout, req){
-    // Reads the session data stored in the cookie named 'key' if it validates,
-    // otherwise returns an empty object.
-
-    var cookies = exports.readCookies(req);
-    if(cookies[key]){
-        return exports.deserialize(secret, timeout, cookies[key]);
-    }
-    return undefined;
-};
-
-
-exports.expires = function(timeout){
-    return (new Date(new Date().getTime() + (timeout))).toUTCString();
-};
diff --git a/node_modules/cookie-sessions/package.json b/node_modules/cookie-sessions/package.json
deleted file mode 100644
index 374ff1a76..000000000
--- a/node_modules/cookie-sessions/package.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{ "name": "cookie-sessions"
-, "description": "Secure cookie-based session middleware for Connect"
-, "main": "./index"
-, "author": "Caolan McMahon"
-, "version": "0.0.3"
-, "repository" :
-  { "type" : "git"
-  , "url" : "http://github.com/caolan/cookie-sessions.git"
-  }
-, "bugs" : { "web" : "http://github.com/caolan/cookie-sessions/issues" }
-, "licenses" :
-  [ { "type" : "MIT"
-    , "url" : "http://github.com/caolan/cookie-sessions/raw/master/LICENSE"
-    }
-  ]
-}
diff --git a/node_modules/cookie-sessions/test.js b/node_modules/cookie-sessions/test.js
deleted file mode 100755
index f41d154e3..000000000
--- a/node_modules/cookie-sessions/test.js
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/usr/local/bin/node
-
-require.paths.push(__dirname);
-require.paths.push(__dirname + '/deps');
-require.paths.push(__dirname + '/lib');
-
-try {
-    var testrunner = require('nodeunit').testrunner;
-}
-catch(e) {
-    var sys = require('sys');
-    sys.puts("Cannot find nodeunit module.");
-    sys.puts("You can download submodules for this project by doing:");
-    sys.puts("");
-    sys.puts("    git submodule init");
-    sys.puts("    git submodule update");
-    sys.puts("");
-    process.exit();
-}
-
-process.chdir(__dirname);
-testrunner.run(['test']);
diff --git a/node_modules/cookie-sessions/test/test-cookie-sessions.js b/node_modules/cookie-sessions/test/test-cookie-sessions.js
deleted file mode 100644
index 432a8ad93..000000000
--- a/node_modules/cookie-sessions/test/test-cookie-sessions.js
+++ /dev/null
@@ -1,620 +0,0 @@
-var sessions = require('cookie-sessions');
-
-
-exports['split'] = function(test){
-    var hmac_sig = 'c82d1eacb4adb15a3250a6df7c8f190b586ab6b9',
-        timestamp = 1264710287440,
-        data_blob = 'somedata';
-
-    var serialized_cookie = hmac_sig + timestamp + data_blob;
-    test.same(
-        sessions.split(serialized_cookie),
-        {hmac_signature: hmac_sig, timestamp: timestamp, data_blob: data_blob},
-        'split correctly seperates sig, timestamp and data blob'
-    );
-    test.done();
-};
-
-exports['valid'] = function(test){
-    var secret = 'secret';
-        current_valid_sig = '5eaaa22480acefd8b18d67bb194573dc1b75d9db',
-        expired_valid_sig = '9c7ad86913ceeced1f6f249ba52868006c8dfdab',
-        invalid_sig = '51a2a32485a6e7d8b9810711112513d14b15d16b',
-        expired_timestamp = 1264700000000,
-        current_timestamp = 1264710287440,
-        session_timeout = 54000,
-        data_blob = 'somedata';
-
-    var Date_copy = global.Date;
-    global.Date = function(){this.getTime = function(){return 1264710287000}};
-
-    test.ok(
-        sessions.valid(
-            secret, session_timeout,
-            current_valid_sig + current_timestamp + data_blob
-        ) === true,
-        'returns true for valid hmac sig within timeout'
-    );
-    test.ok(
-        sessions.valid(
-            secret, session_timeout,
-            expired_valid_sig + expired_timestamp + data_blob
-        ) === false,
-        'returns false for valid hmac sig past timeout'
-    );
-    test.ok(
-        sessions.valid(
-            secret, session_timeout,
-            invalid_sig + current_timestamp + data_blob
-        ) === false,
-        'returns false for invalid hmac sig within timeout'
-    );
-    test.ok(
-        sessions.valid(
-            secret, session_timeout,
-            invalid_sig + expired_timestamp + data_blob
-        ) === false,
-        'returns false for invalid hmac sig past timeout'
-    );
-
-    // restore Date
-    global.Date = Date_copy;
-    test.done();
-};
-
-exports['decrypt'] = function(test){
-    var r = sessions.decrypt(
-        'secret', '686734eb9e0fff9adea53983210825ef'
-    );
-    test.same(r, 'somedata', 'decrypt sucessfully returns decrypted data');
-    test.done();
-};
-
-exports['encrypt'] = function(test){
-    var r = sessions.encrypt('secret', 'somedata');
-    test.same(
-        r, '686734eb9e0fff9adea53983210825ef',
-        'encrypt sucessfully returns encrypted data'
-    );
-    test.done();
-};
-
-exports['deserialize valid cookie'] = function(test){
-    test.expect(8);
-    // copy some functions
-    var valid = sessions.valid;
-    var decrypt = sessions.decrypt;
-    var parse = JSON.parse;
-
-    sessions.valid = function(secret, timeout, str){
-        test.equals(secret, 'secret', 'valid called with secret');
-        test.equals(timeout, 123, 'valid called with timeout');
-        test.equals(str, 'cookiestring', 'valid called with cookie string');
-        return true;
-    };
-    sessions.split = function(str){
-        test.equals(str, 'cookiestring', 'split called with cookie string');
-        return {data_blob: 'datastr'};
-    };
-    sessions.decrypt = function(secret, str){
-        test.equals(secret, 'secret', 'decrypt called with secret');
-        test.equals(str, 'datastr', 'decrypt called with data string');
-        return 'decrypted_data';
-    };
-    JSON.parse = function(str){
-        test.equals(
-            str, 'decrypted_data', 'JSON.parse called with decrypted data'
-        );
-        return {test:'test'};
-    };
-    var r = sessions.deserialize('secret', 123, 'cookiestring');
-    test.same(r, {test:'test'}, 'deserialize returns parsed json data');
-
-    // restore copied functions:
-    sessions.valid = valid;
-    sessions.decrypt = decrypt;
-    JSON.parse = parse;
-    test.done();
-};
-
-exports['deserialize invalid cookie'] = function(test){
-    test.expect(1);
-    // copy some functions
-    var valid = sessions.valid;
-    var decrypt = sessions.decrypt;
-    var parse = JSON.parse;
-
-    sessions.valid = function(secret, timeout, str){
-        return false;
-    };
-    sessions.decrypt = function(secret, str){
-        test.ok(false, 'should not attempt to decrypt invalid cookie');
-    };
-    JSON.parse = function(str){
-        test.ok(false, 'should not attempt to parse invalid cookie');
-    };
-    try {
-        sessions.deserialize('secret', 123, 'cookiestring');
-    }
-    catch(e){
-        test.ok(true, 'throw exception on invalid cookie');
-    }
-
-    // restore copied functions:
-    sessions.valid = valid;
-    sessions.decrypt = decrypt;
-    JSON.parse = parse;
-    test.done();
-};
-
-exports['serialize'] = function(test){
-    test.expect(7);
-    // copy some functions
-    var encrypt = sessions.encrypt;
-    var hmac_signature = sessions.hmac_signature;
-    var stringify= JSON.stringify;
-    var Date_copy = global.Date;
-
-    global.Date = function(){this.getTime = function(){return 1234;}};
-    JSON.stringify = function(obj){
-        test.same(
-            obj, {test:'test'}, 'JSON.stringify called with cookie data obj'
-        );
-        return 'data';
-    };
-    sessions.encrypt = function(secret, str){
-        test.equals(secret, 'secret', 'encrypt called with secret');
-        test.equals(str, 'data', 'encrypt called with stringified data');
-        return 'encrypted_data';
-    };
-    sessions.hmac_signature = function(secret, timestamp, data_str){
-        test.equals(secret, 'secret', 'hmac_signature called with secret');
-        test.equals(timestamp, 1234, 'hmac_signature called with timestamp');
-        test.equals(
-            data_str, 'encrypted_data',
-            'hmac_signature called with encrypted data string'
-        );
-        return 'hmac';
-    };
-    var r = sessions.serialize('secret', {test:'test'});
-    test.equals(
-        r, 'hmac1234encrypted_data', 'serialize returns correct string'
-    );
-
-    // restore copied functions:
-    sessions.encrypt = encrypt;
-    sessions.hmac_signature = hmac_signature;
-    JSON.stringify = stringify;
-    global.Date = Date_copy;
-    test.done();
-};
-
-exports['serialize data over 4096 chars'] = function(test){
-    test.expect(1);
-    // copy some functions
-    var encrypt = sessions.encrypt;
-    var hmac_signature = sessions.hmac_signature;
-    var stringify= JSON.stringify;
-    var Date_copy = global.Date;
-
-    global.Date = function(){this.getTime = function(){return 1234;}};
-    JSON.stringify = function(obj){
-        return 'data';
-    };
-    sessions.encrypt = function(secret, str){
-        // lets make this too long!
-        var r = '';
-        for(var i=0; i<4089; i++){
-            r = r + 'x';
-        };
-        return r;
-    };
-    sessions.hmac_signature = function(secret, timestamp, data_str){
-        return 'hmac';
-    };
-    try {
-        var r = sessions.serialize('secret', {test:'test'});
-    }
-    catch(e){
-        test.ok(
-            true, 'serializing a cookie over 4096 chars throws an exception'
-        );
-    }
-
-    // restore copied functions:
-    sessions.encrypt = encrypt;
-    sessions.hmac_signature = hmac_signature;
-    JSON.stringify = stringify;
-    global.Date = Date_copy;
-    test.done();
-};
-
-exports['readCookies'] = function(test){
-    var req = {headers: {cookie: "name1=data1; test=\"abcXYZ%20123\""}};
-    var r = sessions.readCookies(req);
-    test.same(r, {name1: 'data1', test: '"abcXYZ 123"'}, 'test header read ok');
-    test.done();
-};
-
-exports['readCookies alternate format'] = function(test){
-    var req = {headers: {cookie: "name1=data1;test=\"abcXYZ%20123\""}};
-    var r = sessions.readCookies(req);
-    test.same(r, {name1: 'data1', test: '"abcXYZ 123"'}, 'test header read ok');
-    test.done();
-};
-
-exports['readCookies no cookie in headers'] = function(test){
-    var req = {headers: {}};
-    var r = sessions.readCookies(req);
-    test.same(r, {}, 'returns empty object');
-    test.done();
-};
-
-exports['readCookies from Connect cookieDecoder'] = function(test){
-    var req = {headers: {}, cookies: {'test':'cookie'}};
-    test.same(sessions.readCookies(req), {'test': 'cookie'});
-    test.done();
-};
-
-exports['readSession'] = function(test){
-    test.expect(5);
-    var readCookies = sessions.readCookies;
-    var deserialize = sessions.deserialize;
-
-    sessions.readCookies = function(r){
-        test.equals(r, 'request_obj', 'readCookies called with request object');
-        return {'node_session': 'cookie_data'};
-    };
-    sessions.deserialize = function(secret, timeout, str){
-        test.equals(secret, 'secret', 'readCookies called with secret');
-        test.equals(timeout, 12, 'readCookies called with timeout');
-        test.equals(str, 'cookie_data', 'readCookies called with cookie data');
-        return {test: 'test'};
-    };
-
-    var r = sessions.readSession(
-        'node_session', 'secret', 12, 'request_obj'
-    );
-    test.same(r, {test: 'test'}, 'session with key node_session read ok');
-
-    // restore copied functions
-    sessions.readCookies = readCookies;
-    sessions.deserialize = deserialize;
-    test.done();
-};
-
-exports['readSession no cookie'] = function(test){
-    test.expect(2);
-    var readCookies = sessions.readCookies;
-    var deserialize = sessions.deserialize;
-
-    sessions.readCookies = function(r){
-        test.equals(r, 'request_obj', 'readCookies called with request object');
-        return {};
-    };
-    sessions.deserialize = function(secret, timeout, str){
-        test.ok(false, 'should not call deserialize');
-    };
-
-    var r = sessions.readSession(
-        'node_session', 'secret', 12, 'request_obj'
-    );
-    test.same(r, undefined, 'return empty session');
-
-    // restore copied functions
-    sessions.readCookies = readCookies;
-    sessions.deserialize = deserialize;
-    test.done();
-};
-
-exports['onRequest'] = function(test){
-    test.expect(5);
-    var readSession = sessions.readSession;
-    var s = {
-        session_key:'_node',
-        secret: 'secret',
-        timeout: 86400
-    };
-    var req = {};
-
-    sessions.readSession = function(key, secret, timeout, req){
-        test.equals(key, '_node', 'readSession called with session key');
-        test.equals(secret, 'secret', 'readSession called with secret');
-        test.equals(timeout, 86400, 'readSession called with timeout');
-        return 'testsession';
-    };
-    var next = function(){
-        test.ok(true, 'chain.next called');
-        test.equals(
-            req.session, 'testsession', 'req.session equals session data'
-        );
-    };
-    sessions(s)(req, 'res', next);
-
-    // restore copied functions
-    sessions.readSession = readSession;
-    test.done();
-};
-
-exports['writeHead'] = function(test){
-    test.expect(6);
-
-    var s = {
-        session_key:'_node',
-        secret: 'secret',
-        timeout: 86400
-    };
-    var req = {headers: {cookie: "_node="}};
-    var res = {
-        writeHead: function(code, headers){
-            test.equals(
-                headers['Set-Cookie'],
-                '_node=serialized_session; ' +
-                'expires=expiry_date; ' +
-                'path=/'
-            );
-            test.equals(headers['original'], 'header');
-        }
-    };
-
-    var serialize = sessions.serialize;
-    sessions.serialize = function(secret, data){
-        test.equals(secret, 'secret', 'serialize called with secret');
-        test.same(data, {test:'test'}, 'serialize called with session data');
-        return 'serialized_session';
-    };
-
-    var expires = sessions.expires;
-    sessions.expires = function(timeout){
-        test.equals(timeout, s.timeout);
-        return 'expiry_date';
-    };
-
-    var next = function(){
-        test.ok(true, 'chain.next called');
-        req.session = {test:'test'};
-        res.writeHead(200, {'original':'header'});
-        // restore copied functions
-        sessions.serialize = serialize;
-        sessions.expires = expires;
-        test.done();
-    };
-    sessions(s)(req, res, next);
-};
-
-exports['writeHead doesnt write cookie if none exists and session is undefined'] = function(test){
-    test.expect(3);
-
-    var s = {
-        session_key:'_node',
-        secret: 'secret',
-        timeout: 86400
-    };
-    var req = {headers: {}};
-    var res = {
-        writeHead: function(code, headers){
-            test.ok(!("Set-Cookie" in headers));
-            test.equals(headers['original'], 'header');
-        }
-    };
-
-    var next = function(){
-        test.ok(true, 'chain.next called');
-        req.session = undefined;
-        res.writeHead(200, {'original':'header'});
-        test.done();
-    };
-    sessions(s)(req, res, next);
-};
-
-exports['writeHead writes empty cookie with immediate expiration if session is undefined'] = function(test){
-    test.expect(4);
-
-    var s = {
-        session_key:'_node',
-        secret: 'secret',
-        timeout: 86400
-    };
-    var req = {headers: {cookie: "_node=Blah"}};
-    var res = {
-        writeHead: function(code, headers){
-            test.equals(
-                headers['Set-Cookie'],
-                '_node=; ' +
-                'expires=now; ' +
-                'path=/'
-            );
-            test.equals(headers['original'], 'header');
-        }
-    };
-
-    var expires = sessions.expires;
-    sessions.expires = function(timeout){
-        test.equals(timeout, 0);
-        return 'now';
-    };
-    var readSession = sessions.readSession;
-    sessions.readSession = function(key, secret, timeout, req) {
-        return {"username": "Bob"};
-    };
-
-    var next = function(){
-        test.ok(true, 'chain.next called');
-        req.session = undefined;
-        res.writeHead(200, {'original':'header'});
-        // restore copied functions
-        sessions.expires = expires;
-        sessions.readSession = readSession;
-        test.done();
-    };
-    sessions(s)(req, res, next);
-};
-
-exports['onInit secret set'] = function(test){
-    test.expect(0);
-    var s = {secret: 'secret'};
-    try {
-        sessions({secret: 'secret'});
-    }
-    catch(e){
-        test.ok(false, 'do nothing if secret set in server settings');
-    }
-    test.done();
-};
-
-exports['onInit no secret set'] = function(test){
-    test.expect(1);
-    try {
-        sessions({});
-    }
-    catch(e){
-        test.ok(true, 'throw exception if no secret set in server settings');
-    }
-    test.done();
-};
-
-exports['set multiple cookies'] = function(test){
-    test.expect(3);
-    var _serialize = sessions.serialize;
-    sessions.serialize = function(){
-        return 'session_data';
-    };
-
-    var _expires = sessions.expires;
-    sessions.expires = function(timeout){
-        test.equals(timeout, 12345);
-        return 'expiry_date';
-    };
-
-    var req = {headers: {cookie:''}};
-    var res = {writeHead: function(statusCode, headers){
-        test.equals(statusCode, 200);
-        test.same(headers, [
-            ['other_header', 'val'],
-            ['Set-Cookie', 'testcookie=testvalue'],
-            ['Set-Cookie', '_node=session_data; ' +
-                           'expires=expiry_date; ' +
-                           'path=/']
-        ]);
-        sessions.serialize = _serialize;
-        sessions.expires = _expires;
-        test.done();
-    }};
-
-    sessions({secret: 'secret', timeout: 12345})(req, res, function(){
-        req.session = {test: 'test'};
-        res.writeHead(200, {
-            'other_header': 'val',
-            'Set-Cookie':'testcookie=testvalue'
-        });
-    });
-};
-
-exports['set single cookie'] = function(test){
-    test.expect(3);
-    var _serialize = sessions.serialize;
-    sessions.serialize = function(){
-        return 'session_data';
-    };
-
-    var _expires = sessions.expires;
-    sessions.expires = function(timeout){
-        test.equals(timeout, 12345);
-        return 'expiry_date';
-    };
-
-    var req = {headers: {cookie:''}};
-    var res = {writeHead: function(statusCode, headers){
-        test.equals(statusCode, 200);
-        test.same(headers, {
-            'other_header': 'val',
-            'Set-Cookie': '_node=session_data; ' +
-                          'expires=expiry_date; ' +
-                          'path=/'
-        });
-        sessions.serialize = _serialize;
-        sessions.expires = _expires;
-        test.done();
-    }};
-    sessions({secret: 'secret', timeout: 12345})(req, res, function(){
-        req.session = {test: 'test'};
-        res.writeHead(200, {'other_header': 'val'});
-    });
-};
-
-exports['handle headers as array'] = function(test){
-    test.expect(3);
-    var _serialize = sessions.serialize;
-    sessions.serialize = function(){
-        return 'session_data';
-    };
-
-    var _expires = sessions.expires;
-    sessions.expires = function(timeout){
-        test.equals(timeout, 12345);
-        return 'expiry_date';
-    };
-
-    var req = {headers: {cookie:''}};
-    var res = {writeHead: function(statusCode, headers){
-        test.equals(statusCode, 200);
-        test.same(headers, [
-            ['header1', 'val1'],
-            ['header2', 'val2'],
-            ['Set-Cookie', '_node=session_data; ' +
-                           'expires=expiry_date; ' +
-                           'path=/']
-        ]);
-        sessions.serialize = _serialize;
-        test.done();
-    }};
-    sessions({secret: 'secret', timeout: 12345})(req, res, function(){
-        req.session = {test: 'test'};
-        res.writeHead(200, [['header1', 'val1'],['header2', 'val2']]);
-    });
-};
-
-exports['convert headers to array'] = function(test){
-    test.same(
-        sessions.headersToArray({'key1':'val1','key2':'val2'}),
-        [['key1','val1'],['key2','val2']]
-    );
-    test.same(
-        sessions.headersToArray([['key1','val1'],['key2','val2']]),
-        [['key1','val1'],['key2','val2']]
-    );
-    test.done();
-};
-
-exports['send cookies even if there are no headers'] = function (test) {
-    test.expect(2);
-    var req = {headers: {cookie:''}};
-    var res = {
-        writeHead: function (code, headers) {
-            test.equal(code, 200);
-            test.ok(headers['Set-Cookie']);
-            test.done();
-        }
-    };
-    sessions({secret: 'secret', timeout: 12345})(req, res, function () {
-        req.session = {test: 'test'};
-        res.writeHead(200);
-    });
-};
-
-exports['send cookies when no headers but reason_phrase'] = function (test) {
-    test.expect(3);
-    var req = {headers: {cookie:''}};
-    var res = {
-        writeHead: function (code, reason_phrase, headers) {
-            test.equal(code, 200);
-            test.equal(reason_phrase, 'reason');
-            test.ok(headers['Set-Cookie']);
-            test.done();
-        }
-    };
-    sessions({secret: 'secret', timeout: 12345})(req, res, function () {
-        req.session = {test: 'test'};
-        res.writeHead(200, 'reason');
-    });
-};
-- 
GitLab