UNPKG

catproxy

Version:

a node proxy or host change tools

229 lines (198 loc) 6.89 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.decodeData = exports.updateExt = exports.betuifyCode = exports.getReqType = exports.getCharset = exports.isBinary = exports.decodeCompress = exports.isJSONP = exports.isMedia = exports.isImage = exports.isDataUrl = exports.isXml = exports.isFont = exports.isJSONStr = undefined; var _zlib = require('zlib'); var _zlib2 = _interopRequireDefault(_zlib); var _log = require('./log'); var _log2 = _interopRequireDefault(_log); var _buffer = require('buffer'); var _mime = require('mime'); var _mime2 = _interopRequireDefault(_mime); var _iconvLite = require('iconv-lite'); var _iconvLite2 = _interopRequireDefault(_iconvLite); var _isbinaryfile = require('isbinaryfile'); var _isbinaryfile2 = _interopRequireDefault(_isbinaryfile); var _path = require('path'); var _path2 = _interopRequireDefault(_path); var _jsBeautify = require('js-beautify'); var _jsBeautify2 = _interopRequireDefault(_jsBeautify); var _promise = require('promise'); var _promise2 = _interopRequireDefault(_promise); var _brotli = require('brotli'); var _brotli2 = _interopRequireDefault(_brotli); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } // <meta charset="gb2312"> // <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> var checkMetaCharset = /<meta(?:\s)+.*charset(?:\s)*=(?:[\s'"])*([^"']+)/i; var isJSONStr = exports.isJSONStr = /(^(?:\s*\[)[\s\S]*(?:\]\s*)$|(^(?:\s*\{)[\s\S]*(?:\}\s*)$))/; var isFont = exports.isFont = /(^font\/.+)|(^application\/x-font.+)|(^application\/font.+)/; var isXml = exports.isXml = /^\s*\<\?xml.*/; var isDataUrl = exports.isDataUrl = /^data:.+/; var isImage = exports.isImage = /^image\/.+/; var isMedia = exports.isMedia = /(^video\/.+)|(^audio\/.+)/; // 这么判断并不准确,最好是用ast,语法树,但是怕性能有问题,就用这个了 // ()中间的参数并不匹配?? var isJSONP = exports.isJSONP = /^\s*[a-zA-Z$_]+[\w$]*\s*\(([\s\S]*)(\)|(?:\)[\s;]*))$/; // 解压数据 var decodeCompress = exports.decodeCompress = function decodeCompress(bodyData, encode) { if (!_buffer.Buffer.isBuffer(bodyData) || !encode) { return _promise2.default.reject(bodyData); } return new _promise2.default(function (resolve, reject) { // 成功的取到bodyData var isZip = /gzip/i.test(encode); var isDeflate = /deflate/i.test(encode); var isBr = /br/i.test(encode); if (isZip) { _zlib2.default.gunzip(bodyData, function (err, buff) { if (err) { _log2.default.error(err); reject('decompress err: ', err.message); } else { resolve(buff); } }); } else if (isBr) { try { var result = _brotli2.default.decompress(bodyData); resolve(_buffer.Buffer.from(result)); } catch (err) { _log2.default.error(err); reject('decompress err: ', err.message); } } else if (isDeflate) { _zlib2.default.inflateRaw(bodyData, function (err, buff) { if (err) { _log2.default.error(err); reject('decompress err: ', err.message); } else { resolve(buff); } }); } else { reject('解压body出错,未知的编码'); } }); }; var isBinary = exports.isBinary = function isBinary(buffer) { var data = void 0; if (_buffer.Buffer.isBuffer(buffer)) { var l = Math.min(512, buffer.length); data = new _buffer.Buffer(l); buffer.copy(data, 0, 0, l); return _isbinaryfile2.default.sync(data, l); } else if (typeof buffer === 'string') { // 通过文件名称判断是否是buffer return false; } return false; }; var getCharset = exports.getCharset = function getCharset(resInfo) { var charset = 'UTF-8'; var contentType = resInfo.headers['content-type'] || ''; var ext = resInfo.ext; // 在取一次编码 if (contentType) { // 如果contenttype上又编码,则重新设置编码 var tmp = contentType.match(/charset=([^;]+)/); if (tmp && tmp.length > 0) { charset = tmp[1].toUpperCase(); return charset; } } // gbk gb2312文件编码怎么解析?? return charset; }; // 根据请求获取请求的类型主要类型在 config/configProps 下地 monitorType var getReqType = exports.getReqType = function getReqType(result) { var contentType = result.resHeaders['content-type'] || ''; var type = 'other'; var headers = result.reqHeaders; var ext = result.ext; if (headers['x-requested-with']) { type = 'xhr'; } else if (isImage.test(contentType)) { type = 'img'; } else if (contentType === 'text/cache-manifest') { type = 'mainifest'; } else if (result.protocol === 'ws' || result.protocol == 'wss') { type = 'ws'; } else if (isFont.test(contentType) || ext === 'ttf' || ext === 'woff') { // svg不能算是字体文件,因为svg可能是别的文件 // font/woff2 application/x-font-ttf 2种都是font type = 'font'; } else if (ext === 'js' || ext === 'jsx' || ext === 'es6' || ext === 'json' || ext === 'map') { type = 'js'; } else if (ext === 'css' || ext === 'less' || ext === 'sass') { type = 'css'; } else if (isMedia.test(contentType)) { // 视频 ,音频 type = 'media'; } else if (ext === 'xhtml' || ext === 'html' || ext === 'hltm') { type = 'doc'; } return type; }; var supportEncode = ['UTF-8', 'GBK', 'GB2312', 'UTF8']; var supportBetuifyType = { js: ['javascript', 'js', 'es6', 'jsx', 'json', 'jsonp'], css: ['css', 'less', 'scass'], html: ['html', 'htm', 'ejs'] }; /** * 按照指定格式美化代码 js-betuify */ var betuifyCode = exports.betuifyCode = function betuifyCode(code, ext) { var some = function some(current) { return ext === current; }; var is = ''; for (var type in supportBetuifyType) { if (supportBetuifyType[type].some(some)) { is = type; break; } } if (is === 'js') { return (0, _jsBeautify2.default)(code); } else if (is === 'css') { return _jsBeautify2.default.css(code); } else if (is === 'html') { return _jsBeautify2.default.html(code); } else { return code; } }; var updateExt = exports.updateExt = function updateExt(ext, contentType) { var data = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; if (isJSONStr.test(data)) { return 'json'; } else if (isJSONP.test(data)) { return 'jsonp'; } else if (isXml.test(data)) { return 'xml'; } return ext; }; /** * 按照指定编码解码文件 * */ var decodeData = exports.decodeData = function decodeData(data) { var charset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'utf8'; return new _promise2.default(function (resolve, reject) { var is = supportEncode.some(function (cur) { return charset.toUpperCase() === cur; }); if (!is) { reject('不支持当前的编码方式:' + charset); } try { resolve(_iconvLite2.default.decode(data, charset)); } catch (e) { reject('解码数据出错'); } }); };