diff --git a/lib/cookies.js b/lib/cookies.js index 6f67a36..d4fc0d0 100644 --- a/lib/cookies.js +++ b/lib/cookies.js @@ -17,67 +17,65 @@ function Cookies(request, response, keys) { } } -Cookies.prototype = { - get: function(name, opts) { - var sigName = name + ".sig" - , header, match, value, remote, data, index - , signed = opts && opts.signed !== undefined ? opts.signed : !!this.keys +Cookies.prototype.get = function(name, opts) { + var sigName = name + ".sig" + , header, match, value, remote, data, index + , signed = opts && opts.signed !== undefined ? opts.signed : !!this.keys - header = this.request.headers["cookie"] - if (!header) return + header = this.request.headers["cookie"] + if (!header) return - match = header.match(getPattern(name)) - if (!match) return + match = header.match(getPattern(name)) + if (!match) return - value = match[1] - if (!opts || !signed) return value + value = match[1] + if (!opts || !signed) return value - remote = this.get(sigName) - if (!remote) return + remote = this.get(sigName) + if (!remote) return - data = name + "=" + value - if (!this.keys) throw new Error('.keys required for signed cookies'); - index = this.keys.index(data, remote) - - if (index < 0) { - this.set(sigName, null, {path: "/", signed: false }) - } else { - index && this.set(sigName, this.keys.sign(data), { signed: false }) - return value - } - }, - - set: function(name, value, opts) { - var res = this.response - , req = this.request - , headers = res.getHeader("Set-Cookie") || [] - , secure = req.protocol === 'https' || req.connection.encrypted - , cookie = new Cookie(name, value, opts) - , signed = opts && opts.signed !== undefined ? opts.signed : !!this.keys - - if (typeof headers == "string") headers = [headers] - - if (!secure && opts && opts.secure) { - throw new Error('Cannot send secure cookie over unencrypted connection') - } - - cookie.secure = secure - if (opts && "secure" in opts) cookie.secure = opts.secure - if (opts && "secureProxy" in opts) cookie.secure = opts.secureProxy - headers = pushCookie(headers, cookie) + data = name + "=" + value + if (!this.keys) throw new Error('.keys required for signed cookies'); + index = this.keys.index(data, remote) + + if (index < 0) { + this.set(sigName, null, {path: "/", signed: false }) + } else { + index && this.set(sigName, this.keys.sign(data), { signed: false }) + return value + } +}; - if (opts && signed) { - if (!this.keys) throw new Error('.keys required for signed cookies'); - cookie.value = this.keys.sign(cookie.toString()) - cookie.name += ".sig" - headers = pushCookie(headers, cookie) - } +Cookies.prototype.set = function(name, value, opts) { + var res = this.response + , req = this.request + , headers = res.getHeader("Set-Cookie") || [] + , secure = req.protocol === 'https' || req.connection.encrypted + , cookie = new Cookie(name, value, opts) + , signed = opts && opts.signed !== undefined ? opts.signed : !!this.keys - var setHeader = res.set ? http.OutgoingMessage.prototype.setHeader : res.setHeader - setHeader.call(res, 'Set-Cookie', headers) - return this + if (typeof headers == "string") headers = [headers] + + if (!secure && opts && opts.secure) { + throw new Error('Cannot send secure cookie over unencrypted connection') } -} + + cookie.secure = secure + if (opts && "secure" in opts) cookie.secure = opts.secure + if (opts && "secureProxy" in opts) cookie.secure = opts.secureProxy + headers = pushCookie(headers, cookie) + + if (opts && signed) { + if (!this.keys) throw new Error('.keys required for signed cookies'); + cookie.value = this.keys.sign(cookie.toString()) + cookie.name += ".sig" + headers = pushCookie(headers, cookie) + } + + var setHeader = res.set ? http.OutgoingMessage.prototype.setHeader : res.setHeader + setHeader.call(res, 'Set-Cookie', headers) + return this +}; function Cookie(name, value, attrs) { value || (this.expires = new Date(0)) @@ -88,32 +86,30 @@ function Cookie(name, value, attrs) { for (var name in attrs) this[name] = attrs[name] } -Cookie.prototype = { - path: "/", - expires: undefined, - domain: undefined, - httpOnly: true, - secure: false, - overwrite: false, +Cookie.prototype.path = "/"; +Cookie.prototype.expires = undefined; +Cookie.prototype.domain = undefined; +Cookie.prototype.httpOnly = true; +Cookie.prototype.secure = false; +Cookie.prototype.overwrite = false; - toString: function() { - return this.name + "=" + this.value - }, +Cookie.prototype.toString = function() { + return this.name + "=" + this.value +}; - toHeader: function() { - var header = this.toString() +Cookie.prototype.toHeader = function() { + var header = this.toString() - if (this.maxAge) this.expires = new Date(Date.now() + this.maxAge); + if (this.maxAge) this.expires = new Date(Date.now() + this.maxAge); - if (this.path ) header += "; path=" + this.path - if (this.expires ) header += "; expires=" + this.expires.toUTCString() - if (this.domain ) header += "; domain=" + this.domain - if (this.secure ) header += "; secure" - if (this.httpOnly ) header += "; httponly" + if (this.path ) header += "; path=" + this.path + if (this.expires ) header += "; expires=" + this.expires.toUTCString() + if (this.domain ) header += "; domain=" + this.domain + if (this.secure ) header += "; secure" + if (this.httpOnly ) header += "; httponly" - return header - } -} + return header +}; // back-compat so maxage mirrors maxAge Object.defineProperty(Cookie.prototype, 'maxage', {