Skip to content
This repository has been archived by the owner on Jul 12, 2024. It is now read-only.

Commit

Permalink
Use createReadStream instead of sendFile to avoid headers breaking ch…
Browse files Browse the repository at this point in the history
…anges

Closes mockoon/mockoon#605
  • Loading branch information
Guillaume committed Jan 27, 2022
1 parent f0a2d1d commit 872c2e6
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 56 deletions.
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@mockoon/commons-server",
"description": "Mockoon's commons server library. Used in Mockoon desktop application and CLI.",
"version": "2.15.4",
"version": "2.15.5",
"author": {
"name": "Guillaume Monnet",
"email": "hi@255kb.dev",
Expand Down
106 changes: 53 additions & 53 deletions src/libs/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import {
import cookieParser from 'cookie-parser';
import { EventEmitter } from 'events';
import express, { Application, NextFunction, Request, Response } from 'express';
import { access, constants, readFile, readFileSync } from 'fs';
import { createReadStream, readFile, readFileSync, statSync } from 'fs';
import { createServer as httpCreateServer, Server as httpServer } from 'http';
import { createProxyMiddleware } from 'http-proxy-middleware';
import {
Expand Down Expand Up @@ -435,21 +435,18 @@ export class MockoonServer extends (EventEmitter as new () => TypedEmitter<Serve
) {
const fileServingError = (error) => {
this.emit('error', ServerErrorCodes.ROUTE_FILE_SERVING_ERROR, error);

this.sendError(
response,
`${Texts.EN.MESSAGES.ROUTE_FILE_SERVING_ERROR}${error.message}`
);
};

const fileErrorThrowOrFallback = (error) => {
if (error && !routeResponse.fallbackTo404) {
throw error;
} else if (error && routeResponse.fallbackTo404) {
const errorThrowOrFallback = (error) => {
if (routeResponse.fallbackTo404) {
response.status(404);
this.serveBody(routeResponse, request, response);

return;
} else {
fileServingError(error);
}
};

Expand All @@ -467,60 +464,63 @@ export class MockoonServer extends (EventEmitter as new () => TypedEmitter<Serve

const fileMimeType = mimeTypeLookup(filePath) || '';

access(filePath, constants.R_OK, (accessError) => {
try {
if (accessError) {
fileErrorThrowOrFallback(accessError);
// set content-type to route response's one or the detected mime type if none
if (!routeContentType) {
response.set('Content-Type', fileMimeType);
}

return;
}
if (!routeResponse.sendFileAsBody) {
response.set(
'Content-Disposition',
`attachment; filename="${basename(filePath)}"`
);
}

// set content-type to route response's one or the detected mime type if none
if (!routeContentType) {
response.set('Content-Type', fileMimeType);
}
// parse templating for a limited list of mime types
if (
MimeTypesWithTemplating.indexOf(fileMimeType) > -1 &&
!routeResponse.disableTemplating
) {
readFile(filePath, (readError, data) => {
if (readError) {
errorThrowOrFallback(readError);

if (!routeResponse.sendFileAsBody) {
response.set(
'Content-Disposition',
`attachment; filename="${basename(filePath)}"`
);
return;
}

// parse templating for a limited list of mime types
if (
MimeTypesWithTemplating.indexOf(fileMimeType) > -1 &&
!routeResponse.disableTemplating
) {
readFile(filePath, (readError, data) => {
try {
if (readError) {
fileErrorThrowOrFallback(readError);

return;
}

const fileContent = TemplateParser(
data.toString(),
request,
this.environment
);
try {
const fileContent = TemplateParser(
data.toString(),
request,
this.environment
);

response.body = fileContent;
response.send(fileContent);
} catch (error: any) {
fileServingError(error);
}
});
} else {
response.body = BINARY_BODY;
// use sendFile for better performances (streaming)
response.sendFile(filePath);
response.body = fileContent;
response.send(fileContent);
} catch (error: any) {
fileServingError(error);
}
});
} else {
try {
response.body = BINARY_BODY;
const { size } = statSync(filePath);
this.setHeaders(
[
{
key: 'Content-Length',
value: size.toString()
}
],
response,
request
);
// use read stream for better performance
createReadStream(filePath).pipe(response);
} catch (error: any) {
fileServingError(error);
errorThrowOrFallback(error);
}
});
}
} catch (error: any) {
this.emit('error', ServerErrorCodes.ROUTE_SERVING_ERROR, error);

Expand Down

0 comments on commit 872c2e6

Please sign in to comment.