whistle.data-checker
Version:
data checker for testing
72 lines (65 loc) • 2.73 kB
JavaScript
// REQ_FROM_HEADER: REQ_FROM_HEADER,
// RULE_VALUE_HEADER: RULE_VALUE_HEADER,
// MAX_AGE_HEADER: MAX_AGE_HEADER,
// ETAG_HEADER: ETAG_HEADER,
// SSL_FLAG_HEADER: SSL_FLAG_HEADER,
// FULL_URL_HEADER: FULL_URL_HEADER,
// REAL_URL_HEADER: REAL_URL_HEADER,
// CUR_RULE_HEADER: CUR_RULE_HEADER,
// REQ_ID_HEADER: REQ_ID_HEADER,
// STATUS_CODE_HEADER: STATUS_CODE_HEADER,
// LOCAL_HOST_HEADER: LOCAL_HOST_HEADER,
// HOST_VALUE_HEADER: LOCAL_HOST_HEADER,
// CUR_HOST_HEADER: CUR_HOST_HEADER,
// CUR_PROXY_HEADER: CUR_PROXY_HEADER,
// PROXY_VALUE_HEADER: PROXY_VALUE_HEADER,
// CUR_PAC_HEADER: CUR_PAC_HEADER,
// PAC_VALUE_HEADER: PAC_VALUE_HEADER,
// METHOD_HEADER: METHOD_HEADER,
// CLIENT_IP_HEADER: config.CLIENT_IP_HEAD,
// CLIENT_PORT_HEAD: CLIENT_PORT_HEAD,
// GLOBAL_VALUE_HEAD: GLOBAL_VALUE_HEAD,
// HOST_IP_HEADER: HOST_IP_HEADER,
const vm = require('vm');
const options = require('./options');
const noop = () => {
};
const getHeader = (req, name) => {
const value = req.headers[name];
return value ? decodeURIComponent(value) : '';
};
// TODO: 考虑一个埋点上报多条数据的情况,getFields => Array or Object
function getFields(req, reqBody) {
// whistle 将 headers key 都转成小写了
const contentType = req.headers['content-type'];
if (contentType.indexOf('application/json') !== -1) {
// TODO: 考虑 query, form-data, json 多种参数类型
reqBody = JSON.parse(reqBody);
}
const ruleValue = getHeader(req, options.RULE_VALUE_HEADER).trim();
if (ruleValue) {
const context = { reqBody };
vm.createContext(context);
// 虚拟机中运行 timeout=2s, 防止用户代码死循环
vm.runInContext(ruleValue, context, { timeout: 2000 });
// eslint-disable-next-line no-prototype-builtins
if (context.hasOwnProperty('fields') && typeof context.fields === 'function') {
// TODO: 如果用户写了错误的代码如何提示用户
return context.fields(reqBody);
}
if (context.hasOwnProperty('validate') && typeof context.fields === 'function') {
// TODO: 实现前置校验
}
}
return reqBody;
}
exports.noop = noop;
exports.getReqId = req => getHeader(req, options.REQ_ID_HEADER);
exports.getRuleValue = req => getHeader(req, options.RULE_VALUE_HEADER);
exports.getFullUrl = req => getHeader(req, options.FULL_URL_HEADER);
exports.getRealUrl = req => getHeader(req, options.REAL_URL_HEADER);
exports.getMethod = req => getHeader(req, options.METHOD_HEADER);
exports.getClientIp = req => getHeader(req, options.CLIENT_IP_HEADER) || '127.0.0.1';
exports.getServerIp = req => getHeader(req, options.HOST_IP_HEADER);
exports.getStatusCode = req => getHeader(req, options.STATUS_CODE_HEADER);
exports.getFields = getFields;