UNPKG

gcl

Version:

码农村nodejs类库,完成解决回调陷阱,配置框架,IOC框架,统一多DB访问框架,可扩展日志框架和io/db/net/thread/pool 克隆表达式,加解密算法等等一系列基础类库和算法的实现

167 lines 6.12 kB
import V from '../common/tool'; import Q from 'querystring'; import U from 'url'; /** * cookie 包含属性,toString与解析方法 cookiecollection 特别注意Cookie中保持的时间戳会在返回时编程字符串,不会自动转换 * @property(name,value,expires,path,domain,max_age,httpOnly,secure) */ export const Cookie = class { constructor(opts = {}) { const { _, __ } = pri(this); opts = V.merge({ name: '', value: '', expires: null, path: '/', domain: null, max_age: null, httpOnly: false, comment: null, secure: false, frameoptions:false }, opts); _.name = opts.name; _.value = opts.value.indexOf('=') >= 0 ? Q.parse((opts.value)) : (opts.value); _.expires = opts.expires ? new Date(opts.expires) : null; _.path = opts.path || ''; _.domain = opts.domain || ''; _.max_age = opts.max_age ? new Date(opts.max_age) : null; _.httpOnly = !!opts.httpOnly; _.comment = opts.comment || ''; _.secure = !!opts.secure; _.frameoptions = opts['X-Frame-Options'] || ''; delete opts.name; delete opts.value; delete opts.expires; delete opts.path; delete opts.domain; delete opts.max_age; delete opts.secure; delete opts.comment; delete opts.httpOnly; delete opts['X-Frame-Options']; delete opts.frameoptions; _.options = opts; } /** * 判断Cookie是否过期 */ get IsExpire() { const { _, __ } = pri(this); const now = new Date(); return (_.expires ? now.diff('ms', _.expires) > 0 : false) || (_.max_age ? now.diff('ms', _.max_age) > 0 : false); } /** * 用于服务端使用产生Set-Cookie返回字段 */ toServerString() { const { _, __ } = pri(this); let sb = V.sb(); sb.append(_.toString().trim(';')); if (_.path) sb.append(";Path=" + _.path); if (_.expires) sb.append("; expires=" + _.expires.toUTCString()); if (_.max_age) sb.append("; Max-Age=" + _.max_age.toUTCString()); if (_.domain) sb.append("; Domain=" + _.domain); if (_.frameoptions) sb.append('; X-Frame-Options=').append(_.frameoptions); if(_.options) for(var k in _.options) sb.append('; ').append(k).append('=').append(_.options[k]); if (_.secure) sb.append("; Secure"); if (_.httpOnly) sb.append("; HTTPOnly"); const ret = sb.clear(); sb = null; return ret; } /** * 用于客户端使用产生Cookie上传字段内容 */ toString() { const { _, __ } = pri(this); return V.format('{name}={value};', { name: _.name, value: (function() { if (typeof(_.value) == 'string') return (_.value); else { for (let i in _.value) { if (_.value[i] && V.getType(_.value[i]) != 'string') _.value[i] = V.toJsonString(_.value[i]); } return Q.stringify(_.value); } })() }); } } /** * 广度优先的字典合并 */ export const merge = function(ret, ret2) { for (let k in ret2) { let v = ret2[k]; if (v.toString && v.name) { ret[k] = v; } } }; /** * 用于生成request({"Cookie",toString(url)})的参数') */ export const toString = function(ret, url) { var opts = url ? U.parse(url) : {}; var sb = V.sb(); for (let k in ret) { let v = ret[k]; if (v.toString && v.name) { if (!v.IsExpire && (!V.isValid(v.domain) || !V.isValid(opts.host) || (v.domain && opts.host.toLowerCase().indexOf(v.domain.toLowerCase()) >= 0))) sb.append(v.toString()); } } var val = sb.clear(); sb = null; return val; }; /** * parse:用于客户端使用获取resp.headers[\'set-cookie\']信息 */ export const parse = (cookies = []) => { let ret = {}; if (cookies) { cookies.forEach(v => { let val = {}; v.split(';').filter(v => V.isValid(v)).forEach(v2 => { var kv = v2.split('='); if (V.toJsonString(val).length == 2) { val.name = kv[0].trim(); val.value = v2.substr(kv[0].length + 1); } else val[kv[0].trim()] = v2.substr(kv[0].length).trim('='); }); ret[val.name] = new Cookie(val); }); } return ret; }; /** * toHeaderArray:用于生成response.setHeader("Set-Cookie",toHeaderArray);的参数' * */ export const toHeaderArray = function(ret) { var vals = []; for (let k in ret) { let v = ret[k]; if (v && v.toServerString) vals.push(v.toServerString()); } return vals; }; /** serverParse:用于服务端使用获取Cookie信息'*/ export const serverParse = str => { var ret = {}; if (str) str.split(';').filter(v => V.isValid(v)).forEach(v => { var vals = v.split('='); if (vals.length >= 2) { ret[vals[0].trim()] = new Cookie({ name: vals[0], value: (v.substr(vals[0].length + 1)) }); } }); return ret; }; export default { Cookie, merge, toString, toHeaderArray, serverParse, parse }; const pri = V.pris();