3 * Copyright(c) 2012-2014 Roman Shtylman
\r
12 exports.parse = parse;
\r
13 exports.serialize = serialize;
\r
20 var decode = decodeURIComponent;
\r
21 var encode = encodeURIComponent;
\r
24 * Parse a cookie header.
\r
26 * Parse the given cookie header string into an object
\r
27 * The object has the various cookies as keys(names) => values
\r
29 * @param {string} str
\r
30 * @param {object} [options]
\r
35 function parse(str, options) {
\r
37 var opt = options || {};
\r
38 var pairs = str.split(/; */);
\r
39 var dec = opt.decode || decode;
\r
41 pairs.forEach(function(pair) {
\r
42 var eq_idx = pair.indexOf('=')
\r
44 // skip things that don't look like key=value
\r
49 var key = pair.substr(0, eq_idx).trim()
\r
50 var val = pair.substr(++eq_idx, pair.length).trim();
\r
53 if ('"' == val[0]) {
\r
54 val = val.slice(1, -1);
\r
58 if (undefined == obj[key]) {
\r
59 obj[key] = tryDecode(val, dec);
\r
67 * Serialize data into a cookie header.
\r
69 * Serialize the a name value pair into a cookie string suitable for
\r
70 * http headers. An optional options object specified cookie parameters.
\r
72 * serialize('foo', 'bar', { httpOnly: true })
\r
73 * => "foo=bar; httpOnly"
\r
75 * @param {string} name
\r
76 * @param {string} val
\r
77 * @param {object} [options]
\r
82 function serialize(name, val, options) {
\r
83 var opt = options || {};
\r
84 var enc = opt.encode || encode;
\r
85 var pairs = [name + '=' + enc(val)];
\r
87 if (null != opt.maxAge) {
\r
88 var maxAge = opt.maxAge - 0;
\r
89 if (isNaN(maxAge)) throw new Error('maxAge should be a Number');
\r
90 pairs.push('Max-Age=' + maxAge);
\r
93 if (opt.domain) pairs.push('Domain=' + opt.domain);
\r
94 if (opt.path) pairs.push('Path=' + opt.path);
\r
95 if (opt.expires) pairs.push('Expires=' + opt.expires.toUTCString());
\r
96 if (opt.httpOnly) pairs.push('HttpOnly');
\r
97 if (opt.secure) pairs.push('Secure');
\r
99 return pairs.join('; ');
\r
103 * Try decoding a string using a decoding function.
\r
105 * @param {string} str
\r
106 * @param {function} decode
\r
110 function tryDecode(str, decode) {
\r
112 return decode(str);
\r