UNPKG

whistle.data-checker

Version:
72 lines (65 loc) 2.73 kB
// 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;