gcl
Version:
码农村nodejs类库,完成解决回调陷阱,配置框架,IOC框架,统一多DB访问框架,可扩展日志框架和io/db/net/thread/pool 克隆表达式,加解密算法等等一系列基础类库和算法的实现
167 lines • 6.12 kB
JavaScript
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();