UNPKG

catproxy

Version:

a node proxy or host change tools

299 lines (276 loc) 7.56 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _typeof2 = require('babel-runtime/helpers/typeof'); var _typeof3 = _interopRequireDefault(_typeof2); exports.default = function (cfg) { var data = {}; if (cfg) { // 只能是指定的字段,字段不能是undefined _configProps2.default.forEach(function (cur) { var status = false; if (cfg[cur] !== undefined) { if (cur === 'hosts') { status = !!checkHosts(cfg[cur]); } else if (cur === 'port' || cur === 'httpsPort' || cur === 'uiPort' || cur === 'weinrePort') { cfg[cur] = +cfg[cur]; status = !isNaN(cfg[cur]); } else if (cur === 'type' || cur === 'log' || cur === 'sni') { status = !!valCheck[cur][cfg[cur]]; } else if (cur === 'disCache' || cur === 'autoOpen' || cur === 'cacheFlush') { status = typeof cfg[cur] === 'boolean'; } else if (cur === 'breakHttps') { var list = cfg[cur]; if (Array.isArray(list)) { var result = list.reduce(function (all, current) { if (typeof current === 'string' || Object.prototype.toString.call(current) === '[object RegExp]') { all.push(current.toString().replace(/^\/|\/$/g, '')); return all; } }, []); if (result && result.length) { cfg[cur] = result; status = true; } } else if (typeof list === 'boolean') { status = true; } } else if (cur === 'excludeHttps') { var _list = cfg[cur]; if (Array.isArray(_list)) { var _result = _list.reduce(function (all, current) { if (typeof current === 'string' || Object.prototype.toString.call(current) === '[object RegExp]') { all.push(current.toString().replace(/^\/|\/$/g, '')); return all; } }, []); if (_result && _result.length) { cfg[cur] = _result; status = true; } } else if (_list === '') { status = true; } } else if (cur === 'remoteRuleUrl') { if (cfg[cur] && isUrl.test(cfg[cur])) { status = true; } } else if (cur === 'monitor') { // 检测监控数据 status = checkMonitor(cfg[cur]); } if (status) { data[cur] = cfg[cur]; } else { _log2.default.warn('\u8BBE\u7F6E\u6570\u636E\u88AB\u5FFD\u7565\uFF0C\u6570\u636E\u952E:' + cur + ',\u6570\u636E\u503C:' + cfg[cur]); } } }); } return data; }; var _configProps = require('./configProps'); var _configProps2 = _interopRequireDefault(_configProps); var _log = require('../log'); var _log2 = _interopRequireDefault(_log); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var isUrl = /^https?:\/\/.+/; var ruleType = { host: 'host', localFile: 'localFile', localDir: 'localDir', remoteFile: 'remoteFile', redirect: 'redirect', weinre: 'weinre', regReplace: 'regReplace' }; var checkRules = function checkRules(branch) { var rules = branch.rules; if (rules && rules.length >= 0 && (typeof rules === 'undefined' ? 'undefined' : (0, _typeof3.default)(rules)) === 'object') { // 空数组是合法的 if (rules.length === 0) { return true; } var newRule = []; var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = rules[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var rule = _step.value; if (rule.type && ruleType[rule.type] && rule.test) { rule.type = rule.type.trim(); rule.exec = rule.exec.trim(); rule.test = rule.test.trim(); newRule.push(rule); } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } branch.rules = newRule; return true; } }; var checkBranch = function checkBranch(branchs) { if (branchs && branchs.length >= 0 && (typeof branchs === 'undefined' ? 'undefined' : (0, _typeof3.default)(branchs)) === 'object') { // 空数组是合法的 if (branchs.length === 0) { return true; } var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = branchs[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var branch = _step2.value; // 名字是必须得字段 if (branch && branch.name !== undefined) { // 没定义这个字段 if (branch.rules === undefined || branch.rules === null) { // 定义一个空得 branch.rules = []; } if (!checkRules(branch)) { return false; } } else { return false; } } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } return true; } }; /** * 检测传进来的规则是否是是符合规范的规则 * @param {[type]} rules 规则 *[{ * name: "caipiao", * isOpen: true, * branch: [{ * name: "test1", * rules: [{ * type: "host", * test: "test", * exec: "192.168.199.100" * }] * }], * }, { * name: "guobao", * disable: true, * branch: [], *}] * @return {[type]} 如果是就返回true,其他都不是 */ var checkHosts = function checkHosts(hosts) { if (hosts && hosts.length >= 0 && (typeof hosts === 'undefined' ? 'undefined' : (0, _typeof3.default)(hosts)) === 'object') { // 空数组是合法的 if (hosts.length === 0) { return true; } var _iteratorNormalCompletion3 = true; var _didIteratorError3 = false; var _iteratorError3 = undefined; try { for (var _iterator3 = hosts[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { var host = _step3.value; if (host && host.name !== undefined) { // 没定义这个字段 if (host.branch === undefined || host.branch === null) { // 定义一个空得 host.branch = []; } if (!checkBranch(host.branch)) { return false; } } else { return false; } } } catch (err) { _didIteratorError3 = true; _iteratorError3 = err; } finally { try { if (!_iteratorNormalCompletion3 && _iterator3.return) { _iterator3.return(); } } finally { if (_didIteratorError3) { throw _iteratorError3; } } } return true; } }; var valCheck = { sni: { 1: true, 2: true }, type: { all: true, http: true, https: true }, log: { error: true, warn: true, info: true, verbose: true, debug: true, silly: true } }; var checkMonitor = function checkMonitor(monitor) { var keys = { monitorStatus: true, monitorFilterStatus: true, monitorFilterType: true, hiddenDataUrl: true }; if ((typeof monitor === 'undefined' ? 'undefined' : (0, _typeof3.default)(monitor)) === 'object') { for (var m in monitor) { if (!keys[m]) { delete monitor[m]; } if (m == 'monitorFilterType') { if (!_configProps.monitorType.some(function (c) { return c === monitor[m]; })) { delete monitor[m]; } } } return true; } return false; }; // 检测配置字段是否合法