UNPKG

catproxy

Version:

a node proxy or host change tools

149 lines (129 loc) 6.95 kB
'use strict'; var _commander = require('commander'); var _commander2 = _interopRequireDefault(_commander); var _package = require('../package.json'); var _package2 = _interopRequireDefault(_package); var _prompt = require('prompt'); var _prompt2 = _interopRequireDefault(_prompt); var _colors = require('colors'); var _colors2 = _interopRequireDefault(_colors); var _app = require('./app'); var _app2 = _interopRequireDefault(_app); var _log = require('./log'); var _log2 = _interopRequireDefault(_log); var _cert = require('./cert/cert.js'); var cert = _interopRequireWildcard(_cert); var _configProps = require('./config/configProps'); var _configProps2 = _interopRequireDefault(_configProps); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } // 将字段变成list var numReg = /^([0-9]){2,}$/; var list = function list(val) { val = val.split(','); val = val.filter(function (current) { return numReg.test(current); }); return val.length ? val : undefined; }; var convertToInt = function convertToInt(num) { var val = parseInt(num); return isNaN(val) ? undefined : val; }; // 说明,注意不要改空格,否则输出到 控制台会变样 var out = '\n *****说明******:\n \'-t http\' 开启http服务器, 此时 \'-p 80\' 表示http服务器端口 \n\n \'-t https\' 开启https服务器, 此时 \'-p 443\' 表示https服务器端口\n \n \'-t all\' 同时开启 https和http服务器, 此时i \'-p 80,443\' 表示 http,https的端口\n\n \'-u\' 表示图形操作界面端口\n\n \'-c\' 表示生成根证书,根证书在https的情况下有用,不生成无法拦截请求\n\n \'-b\' 表示破解http true表示破解,false表示不破解(注意不破解的话就不走proxy,会直接穿越到在线或者本机host配置的那个地址),默认true, 也可以配置 host,不同的host用,分割 如: baidu.com,uc.com,test.com, 表示这些host需要破解\n\t\'-e\' 在设置拦截https的情况下,是否需要排除某些host, 不破解,多个host请以,分割, 可以使用正则, \'\' 重置所有列表为默认, -e优先级高于 -b\n\t\'-s\' sni 设置,该参数在将服务器当做代理使用时有效, 1表示采用nodejs的 snicallback方式(某些浏览器不支持,比如ie6,低版本androi, 默认)2 表示采用多台服务器去代理(全支持,但是性能低)\n'; var opt = {}; _commander2.default.version(_package2.default.version).option('-v, --version', '版本号码').option('-t, --type [value]', 'http或者https服务器类型, 同时开启2种服务器用all表示', /^(http|https|all)$/i).option('-p, --port [list]', '代理端口 默认 http: 80, https: 443, 多个端口用,分割第一个表示http,第二个表示https', list).option('-u, --ui [port]', '界面端口 8001, 0表示没有后台管理界面', convertToInt).option('--autoOpen [ui]', "自动打开图形界面", /^(true|false)$/).option('-c, --cert', '生成根证书').option('-b, --break-https [value]', "是否破解https,破解https前请先安装证书, 可以是host,多个host以 , 分割").option('-e, --exclude-https [value]', "在设置拦截https的情况下,是否需要排除某些host,多个host请以,分割, 可以使用正则, '' 重置所有列表为默认, -e优先级高于 -b").option('-s, --sni [value]', "sni 设置,该参数在将服务器当做代理使用时有效, 1表示采用nodejs的 snicallback方式(某些浏览器不支持,比如ie6,低版本androi, 默认)2 表示采用多台服务器去代理(全支持,但是性能低)", /^(1|2)$/i).on('--help', function () { return console.log(_colors2.default.green(out)); }).option('-l, --log [item]', '设置日志级别error, warn, info, verbose, debug, silly', /^(error|warn|info|verbose|debug|silly)$/i).parse(process.argv); // 生成证书 if (_commander2.default.cert) { if (cert.isRootCertExits()) { _prompt2.default.start({ noHandleSIGINT: true }); _prompt2.default.get({ properties: { isOverride: { type: 'string', required: true, message: '请输入 y 或者 n', description: _colors2.default.green("已经存在跟证书,是否覆盖?"), conform: function conform(val) { return val === 'yes' || val === 'no' || val === 'n' || val === 'y'; } } } }, function (err, result) { if (err) { process.exit(1); } else { if (result.isOverride === 'yes' || result.isOverride === 'y') { cert.setRootCert(); } process.exit(0); } }); } else { cert.setRootCert(); process.exit(0); } } else { _configProps2.default.forEach(function (current) { if (_commander2.default[current] === true && current !== "breakHttps" && current !== 'autoOpen') { _commander2.default[current] = undefined; } // 已经输入变量转成小写 转换string成boolean if (typeof _commander2.default[current] === 'string') { _commander2.default[current] = _commander2.default[current].toLowerCase(); if (_commander2.default[current] === 'true') { _commander2.default[current] = true; } if (_commander2.default[current] === 'false') { _commander2.default[current] = false; } } if (_commander2.default[current] !== undefined) { if (current === 'port') { if (_commander2.default[current] && _commander2.default[current].length) { opt.port = _commander2.default[current][0]; if (_commander2.default[current][1]) { opt.httpsPort = _commander2.default[current][1]; } } } else if (current === 'ui') { opt.uiPort = _commander2.default[current]; } else if (current === 'breakHttps') { if (typeof _commander2.default[current] === 'string') { opt[current] = _commander2.default[current].split(','); } else { opt[current] = !!_commander2.default[current]; } } else if (current === 'excludeHttps') { if (typeof _commander2.default[current] === 'string') { if (_commander2.default[current] === '') { opt[current] = ''; } else { opt[current] = _commander2.default[current].split(','); } } } else if (current === 'sni') { opt[current] = +_commander2.default[current]; } else { opt[current] = _commander2.default[current]; } } }); // catproxy main file var catProxy = new _app2.default(opt); // 初始化代理服务器 catProxy.init(); // catProxy.onPipeRequest(function(result) { // return new Promise(function(resolve, reject) { // setTimeout(function() { // log.debug(1, result.host); // resolve(result); // }, 300); // }); // }, function(result) { // log.debug(result.protocol); // }); }