UNPKG

node-web-mvc

Version:
43 lines (42 loc) 2.07 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const MediaType_1 = __importDefault(require("../MediaType")); const AbstractHttpMessageConverter_1 = __importDefault(require("./AbstractHttpMessageConverter")); const Javascript_1 = __importDefault(require("../../../interface/Javascript")); const Resource_1 = __importDefault(require("../../resources/Resource")); const ByteArrayResource_1 = __importDefault(require("../../resources/ByteArrayResource")); const HttpHeaders_1 = __importDefault(require("../HttpHeaders")); const GzipResource_1 = __importDefault(require("../../resources/GzipResource")); class ResourceHttpMessageConverter extends AbstractHttpMessageConverter_1.default { constructor() { super(MediaType_1.default.ALL); } supports(clazz) { return Javascript_1.default.createTyper(clazz).isType(Resource_1.default); } async readInternal(servletContext) { const buffer = await servletContext.request.readBodyAsBuffer(); return new ByteArrayResource_1.default(buffer); } async writeInternal(resource, servletContext) { if (!resource) { return; } const response = servletContext.response; if (resource.mediaType) { response.setHeader(HttpHeaders_1.default.CONTENT_TYPE, resource.mediaType.toString()); } if (!(resource instanceof GzipResource_1.default)) { // 由于gzip下,默认不希望将整个返回内容加载到内存,采用流式返回(且因为该方案无法获取压缩后大小,所以不设置content-length) response.setHeader(HttpHeaders_1.default.CONTENT_LENGTH, resource.contentLength); } else { response.setHeader(HttpHeaders_1.default.TRANSFER_ENCODING, 'chunked'); } await resource.pipe(response.nativeResponse); } } exports.default = ResourceHttpMessageConverter;