From 865d635d8d306699e2fd0cb3c04f00858a776a20 Mon Sep 17 00:00:00 2001 From: Alex Varchuk Date: Mon, 29 Nov 2021 15:37:00 +0200 Subject: [PATCH] fix: add handle for local files --- cli/index.ts | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/cli/index.ts b/cli/index.ts index cd80811eed..0957d95fcb 100644 --- a/cli/index.ts +++ b/cli/index.ts @@ -6,7 +6,7 @@ import { ServerStyleSheet } from 'styled-components'; import { compile } from 'handlebars'; import { createServer, IncomingMessage, ServerResponse } from 'http'; -import { dirname, join, resolve } from 'path'; +import { dirname, join, resolve, extname as getExtName } from 'path'; import * as zlib from 'zlib'; @@ -39,6 +39,24 @@ interface Options { redocOptions?: any; } +export const mimeTypes = { + '.html': 'text/html', + '.js': 'text/javascript', + '.css': 'text/css', + '.json': 'application/json', + '.png': 'image/png', + '.jpg': 'image/jpg', + '.gif': 'image/gif', + '.svg': 'image/svg+xml', + '.wav': 'audio/wav', + '.mp4': 'video/mp4', + '.woff': 'application/font-woff', + '.ttf': 'application/font-ttf', + '.eot': 'application/vnd.ms-fontobject', + '.otf': 'application/font-otf', + '.wasm': 'application/wasm', +}; + const BUNDLES_DIR = dirname(require.resolve('redoc')); /* tslint:disable-next-line */ @@ -191,9 +209,19 @@ async function serve(port: number, pathToSpec: string, options: Options = {}) { 'Content-Type': 'application/json', }); } else { - response.writeHead(404); - response.write('Not found'); - response.end(); + try { + const filePath = join(dirname(pathToSpec), request.url || ''); + const extname = String(getExtName(filePath)).toLowerCase() as keyof typeof mimeTypes; + + const contentType = mimeTypes[extname] || 'application/octet-stream'; + respondWithGzip(createReadStream(filePath), request, response, { + 'Content-Type': contentType, + }); + } catch (e) { + response.writeHead(404); + response.write('Not found'); + response.end(); + } } console.timeEnd('GET ' + request.url);