UNPKG

node-web-mvc

Version:
93 lines (92 loc) 4.56 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); /** * @module MultipartMessageConverter * @description 一个用于处理http请求格式为multipart/类型内容的处理器 */ const MediaType_1 = __importDefault(require("../MediaType")); const MultipartFile_1 = __importDefault(require("../MultipartFile")); const AbstractBodyReader_1 = __importDefault(require("./AbstractBodyReader")); const NoBoundaryException_1 = __importDefault(require("../../../errors/NoBoundaryException")); const MultipartSubpart_1 = __importDefault(require("./MultipartSubpart")); class MultipartBodyReader extends AbstractBodyReader_1.default { constructor(config) { super(MediaType_1.default.MULTIPART_FORM_DATA); this.multipart = config; } readInternal(request, mediaType) { const nativeRequest = request.nativeRequest; const boundary = mediaType.parameters['boundary']; if (!boundary) { throw new NoBoundaryException_1.default(); } const startBoundary = `--${boundary}`; const toString = (buffer) => buffer.toString(mediaType.charset); return new Promise((resolve, reject) => { let subpart = new MultipartSubpart_1.default(startBoundary, this.multipart, []); const formValues = {}; const promises = []; nativeRequest.on('error', reject); nativeRequest.on('data', (chunk) => { try { chunk.forEach((code, index) => { var _a, _b; if (subpart.read(code)) { return; } const buffer = subpart.currentBuffer; switch (subpart.status) { case 'boundary': if (toString(buffer) == startBoundary) { subpart.status = 'header'; } subpart.clearBuffer(); break; case 'header': if (!subpart.parseSubpartHeader(toString(buffer))) { subpart.status = 'body'; (_b = (_a = subpart.writter) === null || _a === void 0 ? void 0 : _a.on) === null || _b === void 0 ? void 0 : _b.call(_a, 'error', reject); } subpart.clearBuffer(); break; case 'body': { const name = subpart.name; const result = subpart.finish(mediaType.charset); const v = result.content; if (result.promise) { promises.push(result.promise); } if (formValues[name] instanceof Array) { formValues[name].push(v); } else if (formValues[name]) { formValues[name] = [formValues[name], v]; } else { formValues[name] = v; } if (v instanceof MultipartFile_1.default) { request.servletContext.addReleaseQueue(() => v.destory()); } // 读取结束,开始读取下一个subpart subpart = new MultipartSubpart_1.default(startBoundary, this.multipart, subpart.tempRaw); } break; } }); } catch (ex) { reject(ex); } }); nativeRequest.on('end', () => { Promise.all(promises).then(() => resolve(formValues), (error) => reject(error)); }); }); } } exports.default = MultipartBodyReader;