node-web-mvc
Version:
node spring mvc
59 lines (58 loc) • 2.63 kB
JavaScript
;
/**
* @module ResourceRegionHttpMessageConverter
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const AbstractHttpMessageConverter_1 = __importDefault(require("./AbstractHttpMessageConverter"));
const HttpHeaders_1 = __importDefault(require("../HttpHeaders"));
const HttpStatus_1 = __importDefault(require("../HttpStatus"));
const MediaType_1 = __importDefault(require("../MediaType"));
const Javascript_1 = __importDefault(require("../../../interface/Javascript"));
const RegionsResource_1 = __importDefault(require("../../resources/RegionsResource"));
const GzipResource_1 = __importDefault(require("../../resources/GzipResource"));
class ResourceRegionHttpMessageConverter extends AbstractHttpMessageConverter_1.default {
constructor() {
super(MediaType_1.default.ALL);
}
supports(clazz) {
return Javascript_1.default.createTyper(clazz).isType(RegionsResource_1.default);
}
async readInternal(servletContext) {
throw new Error('ResourceRegionHttpMessageConverter not support read');
}
async writeInternal(resource, servletContext) {
const regions = resource.regions;
const response = servletContext.response;
for (const region of regions) {
await this.writeRegion(region, servletContext.response);
}
return response.end();
}
async writeRegion(region, response) {
if (!(region === null || region === void 0 ? void 0 : region.resource)) {
return;
}
const resource = region.resource;
const start = region.position;
let end = region.end;
const resourceLength = resource.contentLength;
end = Math.min(end, resourceLength - 1);
const rangeLength = end - start + 1;
const nativeResponse = response.nativeResponse;
response.setHeader(HttpHeaders_1.default.CONTENT_RANGE, `bytes ${start}-${end}/${resourceLength}`);
if (!(resource instanceof GzipResource_1.default)) {
// gzip下不返回content-length
response.setHeader(HttpHeaders_1.default.CONTENT_LENGTH, rangeLength);
}
else {
response.setHeader(HttpHeaders_1.default.TRANSFER_ENCODING, 'chunked');
}
response.setStatus(HttpStatus_1.default.PARTIAL_CONTENT);
response.nativeResponse.statusCode = 206;
await resource.pipe(nativeResponse, start, end);
}
}
exports.default = ResourceRegionHttpMessageConverter;