UNPKG

vesh

Version:

码农nodejs版本VESH框架,使用函数责任链模式 实现了 默认文件跳转,自定义错误页,空文件处理,URL解析,Querystring与Form参数解析,PostFiles解析,MVC自动映射,SQL自动服务化,可继承页面,静态文件,json,tjson,jsonp,tjsonp,string,void,xjson,xjosnp等等6种JSON格式,http与https等等操作

1,186 lines (1,047 loc) 41 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.FilesModuler = exports.CacheModuler = exports.LimitModuler = exports.EmptyModuler = exports.InitSessionModuler = exports.CookieModuler = exports._FilesModuler = exports.FormModuler = exports.HeaderModuler = exports.StatusModuler = exports.DefaultModuler = undefined; var _regenerator = require("babel-runtime/regenerator"); var _regenerator2 = _interopRequireDefault(_regenerator); var _asyncToGenerator2 = require("babel-runtime/helpers/asyncToGenerator"); var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); var _getPrototypeOf = require("babel-runtime/core-js/object/get-prototype-of"); var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck"); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require("babel-runtime/helpers/createClass"); var _createClass3 = _interopRequireDefault(_createClass2); var _possibleConstructorReturn2 = require("babel-runtime/helpers/possibleConstructorReturn"); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require("babel-runtime/helpers/inherits"); var _inherits3 = _interopRequireDefault(_inherits2); var _tool = require("gcl/com/coooders/common/tool"); var _tool2 = _interopRequireDefault(_tool); var _ni = require("gcl/com/coooders/db/ni"); var _ni2 = _interopRequireDefault(_ni); var _app = require("./app"); var _querystring = require("querystring"); var _querystring2 = _interopRequireDefault(_querystring); var _httpErrors = require("http-errors"); var _httpErrors2 = _interopRequireDefault(_httpErrors); var _arraystream = require("gcl/com/coooders/collection/arraystream"); var _iconvLite = require("iconv-lite"); var _iconvLite2 = _interopRequireDefault(_iconvLite); var _url = require("url"); var _url2 = _interopRequireDefault(_url); var _zlib = require("zlib"); var _zlib2 = _interopRequireDefault(_zlib); var _cookie = require("gcl/com/coooders/net/cookie"); var _cookie2 = _interopRequireDefault(_cookie); var _mime = require("gcl/com/coooders/net/mime"); var _tool3 = require("gcl/com/coooders/io/tool"); var _tool4 = _interopRequireDefault(_tool3); var _fs = require("fs"); var _fs2 = _interopRequireDefault(_fs); var _busboy = require("busboy"); var _busboy2 = _interopRequireDefault(_busboy); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * 使用判断如果未根目录就自动设置默认页面地址 */ var DefaultModuler = exports.DefaultModuler = function (_AModuler) { (0, _inherits3.default)(DefaultModuler, _AModuler); function DefaultModuler() { var path = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var isRedirect = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; (0, _classCallCheck3.default)(this, DefaultModuler); var _this = (0, _possibleConstructorReturn3.default)(this, (DefaultModuler.__proto__ || (0, _getPrototypeOf2.default)(DefaultModuler)).call(this, "DefaultModuler")); pri(_this, { path: path.split("?")[0], isRedirect: isRedirect }); return _this; } (0, _createClass3.default)(DefaultModuler, [{ key: "onrequest", value: function onrequest(req, rep, session) { var _pri = pri(this), _ = _pri._, __ = _pri.__; var query = req.url.split("?"); if (query[0].length <= 1) { req.url = __.path + (query[1] || ""); if (__.isRedirect) session.redirect(req.url); } return false; } }]); return DefaultModuler; }(_app.AModuler); /** * StatusCode进行判断自动转向指定的错误页 */ var StatusModuler = exports.StatusModuler = function (_AModuler2) { (0, _inherits3.default)(StatusModuler, _AModuler2); function StatusModuler() { var paths = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var valid = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "htm;html"; (0, _classCallCheck3.default)(this, StatusModuler); var _this2 = (0, _possibleConstructorReturn3.default)(this, (StatusModuler.__proto__ || (0, _getPrototypeOf2.default)(StatusModuler)).call(this, "StatusModuler")); var __ = {}; valid.split(";").filter(function (v) { return _tool2.default.isValid(v); }).forEach(function (k) { return __[k] = true; }); pri(_this2, { paths: paths, valid: __ }); return _this2; } (0, _createClass3.default)(StatusModuler, [{ key: "onresponse", value: function onresponse(req, rep, session) { var _pri2 = pri(this), _ = _pri2._, __ = _pri2.__; if (__.paths[rep.statusCode + ""] && __.valid[session.extend]) session.redirect(__.paths[rep.statusCode + ""]); return false; } }]); return StatusModuler; }(_app.AModuler); /** * 用于添加reponse的静态头部 */ var HeaderModuler = exports.HeaderModuler = function (_AModuler3) { (0, _inherits3.default)(HeaderModuler, _AModuler3); function HeaderModuler() { var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; (0, _classCallCheck3.default)(this, HeaderModuler); var _this3 = (0, _possibleConstructorReturn3.default)(this, (HeaderModuler.__proto__ || (0, _getPrototypeOf2.default)(HeaderModuler)).call(this, "HeaderModuler")); pri(_this3, { data: data }); return _this3; } (0, _createClass3.default)(HeaderModuler, [{ key: "onrequest", value: function onrequest(req, rep, session) { var _pri3 = pri(this), _ = _pri3._, __ = _pri3.__; if (req.headers["host"] && req.headers["origin"] && req.headers["host"] !== req.headers["origin"].split("//")[1]) { if (!__.data["Access-Control-Allow-Origin"]) rep.setHeader("Access-Control-Allow-Origin", req.headers["origin"]); if (!__.data["Access-Control-Allow-Credentials"]) rep.setHeader("Access-Control-Allow-Credentials", "true"); } for (var k in __.data) { rep.setHeader(k, __.data[k]); }return false; } }]); return HeaderModuler; }(_app.AModuler); /** * 使用querystring和raw-body完成SessionDataManager.QueryString,Form的管理和设置 */ var FormModuler = exports.FormModuler = function (_AModuler4) { (0, _inherits3.default)(FormModuler, _AModuler4); function FormModuler() { var size = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Math.pow(2, 20) * 4; (0, _classCallCheck3.default)(this, FormModuler); var _this4 = (0, _possibleConstructorReturn3.default)(this, (FormModuler.__proto__ || (0, _getPrototypeOf2.default)(FormModuler)).call(this, "FormModuler")); pri(_this4, { size: size, fregex: /[/\\][^/\\]+$/g, dregex: /\.[^/\\\.]+$/g }); return _this4; } (0, _createClass3.default)(FormModuler, [{ key: "parse", value: function parse(req, rep, session, func) { var _pri4 = pri(this), _ = _pri4._, __ = _pri4.__; var callback = func; req.headers["content-type"] = req.headers["content-type"] || "text/plain"; switch (req.headers["content-type"].split(";")[0].toLowerCase()) { case "ws": case "mqtt": session.form = req.form || {}; func(null, false); return; case "application/x-www-form-urlencoded": callback = function callback(err, data) { try { if (err) func((0, _httpErrors2.default)(415, err));else { session.orgform = data; session.form = _querystring2.default.parse(data); // 判断size长度,判断content-type 分别继续进行处理 func(null, false); } } catch (e) { func((0, _httpErrors2.default)(500, e)); } }; break; case "application/json": callback = function callback(err, data) { try { if (err) func((0, _httpErrors2.default)(415, err));else { session.orgform = data; session.form = _tool2.default.json(data); // 判断size长度,判断content-type 分别继续进行处理 func(null, false); } } catch (e) { func((0, _httpErrors2.default)(500, e)); } }; break; case "text/xml": case "application/xml": callback = function callback(err, data) { try { if (err) func((0, _httpErrors2.default)(415, err));else { session.orgform = data; session.form = _tool2.default.xml().toJson(data); // 判断size长度,判断content-type 分别继续进行处理 func(null, false); } } catch (e) { func((0, _httpErrors2.default)(500, e)); } }; break; case "text/plain": callback = function callback(err, data) { try { if (err) func((0, _httpErrors2.default)(415, err));else { session.orgform = data; session.form = data; // 判断size长度,判断content-type 分别继续进行处理 func(null, false); } } catch (e) { func((0, _httpErrors2.default)(500, e)); } }; break; case "application/octet-stream": //未测试 callback = function callback(err, data, encoding) { try { if (err) func((0, _httpErrors2.default)(415, err));else { session.orgform = data; session.form = _iconvLite2.default.decode(data, encoding || "utf-8"); // 判断GB2312进行处理 func(null, false); } } catch (e) { func((0, _httpErrors2.default)(500, e)); } }; break; case "multipart/form-data": func(null, false); return; default: func((0, _httpErrors2.default)(415, new Error("Invalid Content-Type:" + req.headers["content-type"]))); return; } //需要Form处理 var encoding = (req.headers["content-encoding"] || "identity").toLowerCase() || ""; var cencoding = "utf-8"; var length = req.headers["content-length"] || __.size; var stream = new _arraystream.ArrayStream(length); stream.on("error", callback); stream.on("finish", function (err) { return callback(err, Buffer.from(stream.toArray()).toString("utf-8"), cencoding); }); switch (encoding.toLowerCase()) { case "gzip": req.pipe(_zlib2.default.createGunzip()).pipe(stream); break; case "deflate": req.pipe(_zlib2.default.createInflate()).pipe(stream); break; default: case "identity": req.pipe(stream); break; } } }, { key: "onrequest", value: function () { var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(req, rep, session) { var _pri5, _, __, query; return _regenerator2.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _pri5 = pri(this), _ = _pri5._, __ = _pri5.__; session.url = _url2.default.parse((req.protocol || "http://") + req.headers.host + req.url.replace(/\/+/g, "/")); session.querystring = _querystring2.default.parse(session.url.query, null, null, { decodeURIComponent: decodeURIComponent }); //兼容无后缀和多点的情况 query = session.url.pathname.match(__.fregex); query = query && query[0].substr(1).replace(__.dregex, ""); // || session.url.pathname; session.status = query; session.filename = query; if (!(req.method === "POST")) { _context.next = 12; break; } _context.next = 10; return _tool2.default.callback2(function (call) { return _.parse(req, rep, session, call); }); case 10: _context.next = 13; break; case 12: return _context.abrupt("return", false); case 13: case "end": return _context.stop(); } } }, _callee, this); })); function onrequest(_x7, _x8, _x9) { return _ref.apply(this, arguments); } return onrequest; }() }, { key: "onresponse", value: function onresponse(req, rep, session) { delete session.querystring; delete session.form; delete session.filename; return false; } }]); return FormModuler; }(_app.AModuler); /** * 文件处理 */ var _FilesModuler = exports._FilesModuler = function (_AModuler5) { (0, _inherits3.default)(_FilesModuler, _AModuler5); function _FilesModuler(path) { var limit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Math.pow(2, 20) * 10; (0, _classCallCheck3.default)(this, _FilesModuler); var _this5 = (0, _possibleConstructorReturn3.default)(this, (_FilesModuler.__proto__ || (0, _getPrototypeOf2.default)(_FilesModuler)).call(this, "FilesModuler")); pri(_this5, { limit: limit, postfile: function () { function postfile(path) { (0, _classCallCheck3.default)(this, postfile); pri(this, { path: path }); var that = this; this.stream = _fs2.default.createWriteStream(path); this.stream.on("error", function (err) { return _tool2.default.showException("", err); }); this.stream.on("finish", function () { return delete that.stream; }); } (0, _createClass3.default)(postfile, [{ key: "save", value: function () { var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(path) { var _pri6, __; return _regenerator2.default.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _pri6 = pri(this), __ = _pri6.__; _context2.next = 3; return _tool4.default.copyFile(__.path, path); case 3: return _context2.abrupt("return", _context2.sent); case 4: case "end": return _context2.stop(); } } }, _callee2, this); })); function save(_x11) { return _ref2.apply(this, arguments); } return save; }() }, { key: "remove", value: function remove() { var _pri7 = pri(this), __ = _pri7.__; _fs2.default.unlink(__.path, function () {}); return false; } }, { key: "end", value: function end() { if (this.stream) this.stream.end(); delete this.stream; } }]); return postfile; }(), check: function check(session, req) { if (req.isEnd) { var isF = true; (session.Files ? session.Files : []).forEach(function (v) { isF = v.isEnd && isF; }); return isF; } return false; } }); _this5.path = _tool4.default.formatPath(path); return _this5; } (0, _createClass3.default)(_FilesModuler, [{ key: "parse", value: function parse(datas, spliter, rest) { //将二进制数据根据常用字符串\r\n进行匹配和分割 var strs = Buffer.from(spliter).toJSON().data; var l = 0, r = rest ? rest : 0; var buffer = [], ret = []; while (l < datas.length) { if (datas[l] == strs[r]) { //开始进入第二步测试 if (r < strs.length - 1) r++;else { //匹配成功 同时处理越次匹配这种事 if (buffer.length > 0) ret.push(buffer); ret.push({ isspliter: true }); buffer = []; r = 0; } } else if (r > 0) { //说明匹配失败 l回退 l = l - r; if (l < 0) { //说明数据回退到上次获取的结尾之前,需要进行补充 补充内容是 strs[0-abs(l)] for (var i = 0; i <= Math.abs(l); i++) { buffer.push(strs[i]); }l = 0; } else buffer.push(datas[l]); r = 0; } else buffer.push(datas[l]); l++; } ret.push(buffer); return { datas: ret, rest: r }; } }, { key: "onrequest", value: function onrequest(req, rep, session, call) { var _pri8 = pri(this), _ = _pri8._, __ = _pri8.__; session.Files = []; req.headers["content-type"] = req.headers["content-type"] || ""; if (req.method === "POST" && req.headers["content-type"].toLowerCase().trim().startWith("multipart/form-data")) { var length = req.headers["content-length"], received = 0; if (length > __.limit) { session.end(400, _tool2.default.format("request size is too large:{length}>{limit}", { limit: __.limit, length: length })); return false; } var key = _tool2.default.GUID(); var boundaryKey = req.headers["content-type"].split(";")[1].split("=")[1]; //.trim('-').trim('"').trim("'");//兼容IOS var boundaryKey2 = boundaryKey.trim("-").trim('"').trim("'"); // console.log(291,boundaryKey); session.checker = new _tool4.default.checker(function () { //使用多流截止检查 delete session.checker; call(null, false); }); req.on("error", call); req.on("end", function () { if (received != length) session.end(400, "request size did not match content length:" + length + "!=" + receive); }); session.checker.push(req); var fileStream = null, file = null, rest = 0; //首先有\r\n进行处理 req.on("data", function (data) { received += data.length; var datas = _.parse(data, "\r\n", rest); var strs = datas.datas; rest = datas.rest; //确定文件头部位置 if (strs.length > 1) { //说明找到了头部和头部相关的位置 var isHead = false, hasWrite = false, buffer = 0; strs.forEach(function (v) { if (v.isspliter) { buffer++; } else { var v2 = Buffer.from(v).toString("utf-8"); // switch (v2) { // case '--' + boundaryKey: // case '----' + boundaryKey: // if (file) { // console.log('关闭文件并重新开启文件'); // } // console.log('关闭文件并重新开启文件2',v2); // break; // case 'Content-Transfer-Encoding: binary': // case 'Content-Type: application/octet-stream': // console.log(v2); // break; // case '': // if (isHead) { // isHead = false; // buffer = -1; // return; // } // console.log('空'); // break; // case '--' + boundaryKey + '--': // case '----' + boundaryKey + '--': // //传送结束 // console.log('结束',v2); // break; // default: // //修正上传文件类型类型不为流时 不写入 // if (v2.toLowerCase().startWith('content-type:')) // console.log('content-type:'); // if (v2.indexOf('Content-Disposition:') >= 0) { // console.log('Content-Disposition:'); // } else { // //主要数据入口 // console.log('数据',v.length); // } // break; // } switch (v2) { case "--" + boundaryKey2: case "----" + boundaryKey2: case "--" + boundaryKey: case "----" + boundaryKey: if (file) { //关闭文件并重新开启文件 file.end(); // if (!file.filename) { // file.remove(); // session.Files.pop(); // } file = null; } var path = _.path + _tool2.default.environment.splitChar + key + session.Files.length + ".tmp"; file = new __.postfile(path); file.length = length; session.Files.push(file); session.checker.push(file.stream); buffer = 0; isHead = true; hasWrite = false; break; case "Content-Transfer-Encoding: binary": case "Content-Type: application/octet-stream": break; case "": if (isHead) { isHead = false; buffer = -1; return; } break; case "--" + boundaryKey2 + "--": case "----" + boundaryKey2 + "--": case "--" + boundaryKey + "--": case "----" + boundaryKey + "--": //传送结束 if (file) { //关闭文件并重新开启文件 file.end(); file = null; } break; default: //修正上传文件类型类型不为流时 不写入 if (v2.toLowerCase().startWith("content-type:")) break; if (v2.indexOf("Content-Disposition:") >= 0) { var desc = v2.split('"'); if (file) { file.name = desc[1]; file.filename = desc[3]; } } else { //主要数据入口 while (buffer > 0) { buffer--; if (hasWrite && file) { // file.stream.write(Buffer.from("\r\n")); } } if (v.length > 0) { hasWrite = true; file && file.stream.write(Buffer.from(v)); } } break; } } }); } else if (strs[0].length > 0 && file) file.stream.write(Buffer.from(strs[0])); }); } else call(null, false); } }, { key: "init", value: function init() { _tool4.default.createDir(this.path); } }, { key: "onresponse", value: function onresponse(req, rep, session) { if (session.Files.length > 0) session.Files.forEach(function (v) { return v.remove(); }); return false; } }]); return _FilesModuler; }(_app.AModuler); /** * Cookie处理 */ var CookieModuler = exports.CookieModuler = function (_AModuler6) { (0, _inherits3.default)(CookieModuler, _AModuler6); function CookieModuler() { (0, _classCallCheck3.default)(this, CookieModuler); return (0, _possibleConstructorReturn3.default)(this, (CookieModuler.__proto__ || (0, _getPrototypeOf2.default)(CookieModuler)).call(this, "CookieModuler")); } (0, _createClass3.default)(CookieModuler, [{ key: "onrequest", value: function onrequest(req, rep, session) { session.Cookies = req.headers["cookie"] ? _cookie2.default.serverParse(req.headers["cookie"]) : {}; session.SetCookies = {}; return false; } }, { key: "onresponse", value: function onresponse(req, rep, session) { if (!session.isStatic) for (var i in session.SetCookies) { if (i) { !session.isInterrupt() && rep.setHeader("Set-Cookie", _cookie2.default.toHeaderArray(_tool2.default.getValue(session.SetCookies, {}))); //delete session.Cookies; return false; } }return false; } }]); return CookieModuler; }(_app.AModuler); /** * 会话初始化Moduler */ var InitSessionModuler = exports.InitSessionModuler = function (_AModuler7) { (0, _inherits3.default)(InitSessionModuler, _AModuler7); function InitSessionModuler() { (0, _classCallCheck3.default)(this, InitSessionModuler); return (0, _possibleConstructorReturn3.default)(this, (InitSessionModuler.__proto__ || (0, _getPrototypeOf2.default)(InitSessionModuler)).call(this, "InitSessionModuler")); } (0, _createClass3.default)(InitSessionModuler, [{ key: "onrequest", value: function () { var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(req, rep, session) { return _regenerator2.default.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: _context3.next = 2; return session.initSession(session.param("sessionID") || session.param("SessionID") || session.WebSocket && session.WebSocket.tsessionID); case 2: return _context3.abrupt("return", false); case 3: case "end": return _context3.stop(); } } }, _callee3, this); })); function onrequest(_x12, _x13, _x14) { return _ref3.apply(this, arguments); } return onrequest; }() }, { key: "onresponse", value: function onresponse(req, rep, session) { //这时如果刚刚登录或者已经登录应该进行session的Reset操作 要求如果是WebSocket请求,那么把WebSocket的tsessionID和SessionID进行绑定交换 // 放弃绑定各管各的 // session.WebSocket && // session.resetWebSocketSessionID( // session.param("sessionID") || // session.param("SessionID") || // (session.WebSocket && session.WebSocket.tsessionID) // ); // console.log(494, Object.keys(session.WSSessionMap).length); return false; } }]); return InitSessionModuler; }(_app.AModuler); /** * 空返回值处理 */ var EmptyModuler = exports.EmptyModuler = function (_AModuler8) { (0, _inherits3.default)(EmptyModuler, _AModuler8); function EmptyModuler() { (0, _classCallCheck3.default)(this, EmptyModuler); return (0, _possibleConstructorReturn3.default)(this, (EmptyModuler.__proto__ || (0, _getPrototypeOf2.default)(EmptyModuler)).call(this, "EmptyModuler")); } (0, _createClass3.default)(EmptyModuler, [{ key: "onresponse", value: function onresponse(req, rep, session) { switch (rep.getHeader("content-type") + "") { case "undefined": if (rep.statusCode == 200) { rep.setHeader("Content-Type", _mime.MIME.txt); session.end(404, "no such file or action:" + session.url.pathname); } else { rep.setHeader("Content-Type", _mime.MIME.html + ";charset=utf-8"); } return false; default: return false; } } }]); return EmptyModuler; }(_app.AModuler); /** * 限速Module */ /** * * @param {限制单位时间数量} count * @param {定义单位时间} time * @param {提示错误信息} time */ var LimitModuler = exports.LimitModuler = function (_AModuler9) { (0, _inherits3.default)(LimitModuler, _AModuler9); function LimitModuler() { var error = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "访问人数过多,请稍后重试!"; var count = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 200; var time = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; var limit = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 10000000; (0, _classCallCheck3.default)(this, LimitModuler); var _this9 = (0, _possibleConstructorReturn3.default)(this, (LimitModuler.__proto__ || (0, _getPrototypeOf2.default)(LimitModuler)).call(this, "LimitModuler")); pri(_this9, { count: count, time: time, error: error, limit: limit }); return _this9; } (0, _createClass3.default)(LimitModuler, [{ key: "onrequest", value: function onrequest(req, rep, session) { var _pri9 = pri(this), __ = _pri9.__; session.testLimit("limitModule", __.error, __.count, __.time, __.limit); return false; } }]); return LimitModuler; }(_app.AModuler); /** * 缓存Moduler处理 */ var CacheModuler = exports.CacheModuler = function (_AModuler10) { (0, _inherits3.default)(CacheModuler, _AModuler10); function CacheModuler() { (0, _classCallCheck3.default)(this, CacheModuler); var _this10 = (0, _possibleConstructorReturn3.default)(this, (CacheModuler.__proto__ || (0, _getPrototypeOf2.default)(CacheModuler)).call(this, "CacheModuler")); pri(_this10, { idic: {} }); return _this10; } (0, _createClass3.default)(CacheModuler, [{ key: "onrequest", value: function onrequest(req, rep, session) { var _pri10 = pri(this), _ = _pri10._, __ = _pri10.__; if (__.idic[_tool2.default.hash(req.url)]) { var data = __.idic[_tool2.default.hash(req.url)]; if (data.date.getTime() > new Date().getTime()) { //缓存可用 for (var k in data.headers) { rep.setHeader(k, data.headers[k]); } var stream = new _arraystream.ArrayStream(); stream.write(data.data); session.writeStream(stream); return true; } else return false; } else return false; } }, { key: "onresponse", value: function onresponse(req, rep, session, call) { var _pri11 = pri(this), _ = _pri11._, __ = _pri11.__; if (_tool2.default.isValid(rep.getHeader("content-type"))) { var stream = new _arraystream.ArrayStream(); var sb = session.clearWrite(); if (_tool2.default.isValid(sb)) stream.write(sb, session.encoding); var ss = session.clearStreams(); session.writeStream(stream); if (ss && ss.length > 0) { _tool2.default.each(ss, function (v, next) { v.on("error", function (err) { return session.Log.error("VESH:" + err.stack); }); v.on("end", function () { v.removeAllListeners("err"); v.removeAllListeners("end"); if (next) next(); }); //写入文件 v.pipe(stream, { end: false }); }).then(function () { if (stream.buf.length > 0) __.idic[_tool2.default.hash(req.url)] = { data: Buffer.from(Array.prototype.slice.call(stream.buf, 0)), date: new Date().add("n", 2), headers: { "content-type": rep.getHeader("content-type") } }; call(null, false); }); } else return false; } else return false; } }]); return CacheModuler; }(_app.AModuler); /** * 文件处理 */ var FilesModuler = exports.FilesModuler = function (_AModuler11) { (0, _inherits3.default)(FilesModuler, _AModuler11); function FilesModuler(path) { var limit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Math.pow(2, 20) * 10; (0, _classCallCheck3.default)(this, FilesModuler); var _this11 = (0, _possibleConstructorReturn3.default)(this, (FilesModuler.__proto__ || (0, _getPrototypeOf2.default)(FilesModuler)).call(this, "FilesModuler")); pri(_this11, { limit: limit, postfile: function () { function postfile(path) { (0, _classCallCheck3.default)(this, postfile); pri(this, { path: path }); var that = this; this.stream = _fs2.default.createWriteStream(path); this.stream.on("error", function (err) { return _tool2.default.showException("", err); }); this.stream.on("finish", function () { return delete that.stream; }); } (0, _createClass3.default)(postfile, [{ key: "save", value: function () { var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(path) { var _pri12, __; return _regenerator2.default.wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: _pri12 = pri(this), __ = _pri12.__; _context4.next = 3; return _tool4.default.copyFile(__.path, path); case 3: return _context4.abrupt("return", _context4.sent); case 4: case "end": return _context4.stop(); } } }, _callee4, this); })); function save(_x20) { return _ref4.apply(this, arguments); } return save; }() }, { key: "remove", value: function remove() { var _pri13 = pri(this), __ = _pri13.__; _fs2.default.unlink(__.path, function () {}); return false; } }, { key: "end", value: function end() { if (this.stream) this.stream.end(); delete this.stream; } }]); return postfile; }(), check: function check(session, req) { if (req.isEnd) { var isF = true; (session.Files ? session.Files : []).forEach(function (v) { isF = v.isEnd && isF; }); return isF; } return false; } }); _this11.path = _tool4.default.formatPath(path); return _this11; } (0, _createClass3.default)(FilesModuler, [{ key: "onrequest", value: function onrequest(req, rep, session, call) { var _pri14 = pri(this), _ = _pri14._, __ = _pri14.__; session.Files = []; req.headers["content-type"] = req.headers["content-type"] || ""; if (req.method === "POST" && req.headers["content-type"].toLowerCase().trim().startWith("multipart/form-data")) { var length = req.headers["content-length"], received = 0; if (length > __.limit) { session.end(400, _tool2.default.format("request size is too large:{length}>{limit}", { limit: __.limit, length: length })); return false; } var key = _tool2.default.GUID(); var boundaryKey = req.headers["content-type"].split(";")[1].split("=")[1]; //.trim('-').trim('"').trim("'");//兼容IOS var boundaryKey2 = boundaryKey.trim("-").trim('"').trim("'"); // console.log(291,boundaryKey); session.checker = new _tool4.default.checker(function () { //使用多流截止检查 delete session.checker; call(null, false); }); req.on("error", call); req.on("end", function () { // console.log(600,'request end!') }); session.checker.push(req); var busboy = null; var file = null; try { busboy = (0, _busboy2.default)({ headers: req.headers, limits: __.limit }); busboy.on("file", function (fieldname, fileStream, _ref5) { var filename = _ref5.filename, encoding = _ref5.encoding, mimeType = _ref5.mimeType; if (!filename) return fileStream.resume(); console.log("File [" + fieldname + "]: filename: %j, encoding: %j, mimeType: %j", filename, encoding, mimeType); filename = Buffer.from(filename, "latin1").toString("utf-8"); // if (file) { // //关闭文件并重新开启文件 // file.end(); // // if (!file.filename) { // // file.remove(); // // session.Files.pop(); // // } // file = null; // } var path = _.path + _tool2.default.environment.splitChar + key + session.Files.length + ".tmp"; var file = new __.postfile(path); file.name = filename.split("."); file.name.pop(); file.name = file.name.join("."); file.filename = filename; file.encoding = encoding; file.mimeType = mimeType; file.length = 1; session.Files.push(file); session.checker.push(file.stream); fileStream.on("close", function () { // console.log('File Received!'); received = length; if (file) file.end(); // if (!file.filename) { // file.remove(); // session.Files.pop(); // } file = null; }); fileStream.on("error", function (e) { console.log("File error!", e.message); if (file) file.end(); // if (!file.filename) { // file.remove(); // session.Files.pop(); // } file = null; call(e); }); fileStream.pipe(file.stream); // file.on('data', (data) => { // console.log(`File [${name}] got ${data.length} bytes`); // }).on('close', () => { // console.log(`File [${name}] done`); // }); }); busboy.on("field", function (name, val, info) { console.log("Field [" + name + "]: value: %j", val); }); busboy.on("close", function () { // console.log('Done parsing form!',received,length); if (file) { file.end(); req.unpipe(busboy); busboy.removeAllListeners(); received = length; } if (received != length) session.end(400, "request size did not match content length:" + length + "!=" + received); file = null; }); req.pipe(busboy); } catch (err) { if (file) { req.unpipe(busboy); busboy.removeAllListeners(); } call(err); } } else call(null, false); } }, { key: "init", value: function init() { _tool4.default.createDir(this.path); } }, { key: "onresponse", value: function onresponse(req, rep, session) { if (session.Files.length > 0) session.Files.forEach(function (v) { return v.remove(); }); return false; } }]); return FilesModuler; }(_app.AModuler); exports.default = { DefaultModuler: DefaultModuler, StatusModuler: StatusModuler, HeaderModuler: HeaderModuler, FormModuler: FormModuler, FilesModuler: FilesModuler, CookieModuler: CookieModuler, EmptyModuler: EmptyModuler, CacheModuler: CacheModuler, InitSessionModuler: InitSessionModuler, LimitModuler: LimitModuler }; var pri = _tool2.default.pris(); //# sourceMappingURL=modulers.js.map