node-web-mvc
Version:
node spring mvc
93 lines (92 loc) • 4.56 kB
JavaScript
;
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;