HeaderForResponse(res, "Content-Type", contentType); } } if (!getHeaderFromResponse(res, "Accept-Ranges")) { setHeaderForResponse(res, "Accept-Ranges", "bytes"); } const rangeHeader = getHeaderFromRequest(req, "range"); let start; let end; if (rangeHeader && BYTES_RANGE_REGEXP.test(rangeHeader)) { const size = await new Promise(resolve => { /** @type {import("fs").lstat} */ context.outputFileSystem.lstat(filename, (error, stats) => { if (error) { context.logger.error(error); return; } resolve(stats.size); }); }); const parsedRanges = parseRange(size, rangeHeader, { combine: true }); if (parsedRanges === -1) { const message = "Unsatisfiable range for 'Range' header."; context.logger.error(message); const existingHeaders = getHeaderNames(res); for (let i = 0; i < existingHeaders.length; i++) { res.removeHeader(existingHeaders[i]); } setStatusCode(res, 416); setHeaderForResponse(res, "Content-Range", getValueContentRangeHeader("bytes", size)); setHeaderForResponse(res, "Content-Type", "text/html; charset=utf-8"); const document = createHtmlDocument(416, `Error: ${message}`); const byteLength = Buffer.byteLength(document); setHeaderForResponse(res, "Content-Length", Buffer.byteLength(document)); send(req, res, document, byteLength); return; } else if (parsedRanges === -2) { context.logger.error("A malformed 'Range' header was provided. A regular response will be sent for this request."); } else if (parsedRanges.length > 1) { context.logger.error("A 'Range' header with multiple ranges was provided. Multiple ranges are not supported, so a regular response will be sent for this request."); } if (parsedRanges !== -2 && parsedRanges.length === 1) { // Content-Range setStatusCode(res, 206); setHeaderForResponse(res, "Content-Range", getValueContentRangeHeader("bytes", size, /** @type {import("range-parser").Ranges} */ parsedRanges[0])); [{ start, end }] = parsedRanges; } } const isFsSupportsStream = typeof context.outputFileSystem.createReadStream === "function"; let bufferOtStream; let byteLength; try { if (typeof start !== "undefined" && typeof end !== "undefined" && isFsSupportsStream) { bufferOtStream = /** @type {import("fs").createReadStream} */ context.outputFileSystem.createReadStream(filename, { start, end }); byteLength = end - start + 1; } else { bufferOtStream = /** @type {import("fs").readFileSync} */ context.outputFileSystem.readFileSync(filename); ({ byteLength } = bufferOtStream); } } catch (_ignoreError) { await goNext(); return; } send(req, res, bufferOtStream, byteLength); } }; } module.exports = wrapper;