diff --git a/src/node/routes/errors.ts b/src/node/routes/errors.ts index 32e8ab53..9b5fdae9 100644 --- a/src/node/routes/errors.ts +++ b/src/node/routes/errors.ts @@ -8,14 +8,36 @@ import { rootPath } from "../constants" import { replaceTemplates } from "../http" import { escapeHtml, getMediaMime } from "../util" -const notFoundCodes = ["ENOENT", "EISDIR"] +interface ErrorWithStatusCode { + statusCode: number +} + +interface ErrorWithCode { + code: string +} + +/** Error is network related. */ +export const errorHasStatusCode = (error: any): error is ErrorWithStatusCode => { + return error && "statusCode" in error +} + +/** Error originates from file system. */ +export const errorHasCode = (error: any): error is ErrorWithCode => { + return error && "code" in error +} + +const notFoundCodes = [404, "ENOENT", "EISDIR"] + export const errorHandler: express.ErrorRequestHandler = async (err, req, res, next) => { - if (notFoundCodes.includes(err.code)) { - err.status = HttpCode.NotFound + let statusCode = 500 + + if (errorHasStatusCode(err)) { + statusCode = err.statusCode + } else if (errorHasCode(err) && notFoundCodes.includes(err.code)) { + statusCode = HttpCode.NotFound } - const status = err.status ?? err.statusCode ?? 500 - res.status(status) + res.status(statusCode) // Assume anything that explicitly accepts text/html is a user browsing a // page (as opposed to an xhr request). Don't use `req.accepts()` since @@ -27,8 +49,8 @@ export const errorHandler: express.ErrorRequestHandler = async (err, req, res, n const content = await fs.readFile(resourcePath, "utf8") res.send( replaceTemplates(req, content) - .replace(/{{ERROR_TITLE}}/g, status) - .replace(/{{ERROR_HEADER}}/g, status) + .replace(/{{ERROR_TITLE}}/g, statusCode.toString()) + .replace(/{{ERROR_HEADER}}/g, statusCode.toString()) .replace(/{{ERROR_BODY}}/g, escapeHtml(err.message)), ) } else { diff --git a/vendor/package.json b/vendor/package.json index e98b3e3a..21a86245 100644 --- a/vendor/package.json +++ b/vendor/package.json @@ -7,6 +7,6 @@ "postinstall": "./postinstall.sh" }, "devDependencies": { - "code-oss-dev": "cdr/vscode#8db6c9bb0bc065bdb905dc076f4d4234f126aff7" + "code-oss-dev": "cdr/vscode#a1d3f915454bb88e508c269a3c5bafb3cfa6f9f6" } } diff --git a/vendor/yarn.lock b/vendor/yarn.lock index 17f03ea4..d4886aba 100644 --- a/vendor/yarn.lock +++ b/vendor/yarn.lock @@ -296,9 +296,9 @@ clone-response@^1.0.2: dependencies: mimic-response "^1.0.0" -code-oss-dev@cdr/vscode#8db6c9bb0bc065bdb905dc076f4d4234f126aff7: +code-oss-dev@cdr/vscode#a1d3f915454bb88e508c269a3c5bafb3cfa6f9f6: version "1.61.1" - resolved "https://codeload.github.com/cdr/vscode/tar.gz/8db6c9bb0bc065bdb905dc076f4d4234f126aff7" + resolved "https://codeload.github.com/cdr/vscode/tar.gz/a1d3f915454bb88e508c269a3c5bafb3cfa6f9f6" dependencies: "@microsoft/applicationinsights-web" "^2.6.4" "@vscode/sqlite3" "4.0.12"