Fix issue where 404 errors are mistaken for server errors. (#4534)

* Fix issue where 404 errors are mistaken for server errors.

* Bump vendor.
This commit is contained in:
Teffen 2021-11-19 18:14:13 -05:00 committed by GitHub
parent db35c47315
commit bd09533f40
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 32 additions and 10 deletions

View File

@ -8,14 +8,36 @@ import { rootPath } from "../constants"
import { replaceTemplates } from "../http" import { replaceTemplates } from "../http"
import { escapeHtml, getMediaMime } from "../util" 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) => { export const errorHandler: express.ErrorRequestHandler = async (err, req, res, next) => {
if (notFoundCodes.includes(err.code)) { let statusCode = 500
err.status = HttpCode.NotFound
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(statusCode)
res.status(status)
// Assume anything that explicitly accepts text/html is a user browsing a // 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 // 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") const content = await fs.readFile(resourcePath, "utf8")
res.send( res.send(
replaceTemplates(req, content) replaceTemplates(req, content)
.replace(/{{ERROR_TITLE}}/g, status) .replace(/{{ERROR_TITLE}}/g, statusCode.toString())
.replace(/{{ERROR_HEADER}}/g, status) .replace(/{{ERROR_HEADER}}/g, statusCode.toString())
.replace(/{{ERROR_BODY}}/g, escapeHtml(err.message)), .replace(/{{ERROR_BODY}}/g, escapeHtml(err.message)),
) )
} else { } else {

2
vendor/package.json vendored
View File

@ -7,6 +7,6 @@
"postinstall": "./postinstall.sh" "postinstall": "./postinstall.sh"
}, },
"devDependencies": { "devDependencies": {
"code-oss-dev": "cdr/vscode#8db6c9bb0bc065bdb905dc076f4d4234f126aff7" "code-oss-dev": "cdr/vscode#a1d3f915454bb88e508c269a3c5bafb3cfa6f9f6"
} }
} }

4
vendor/yarn.lock vendored
View File

@ -296,9 +296,9 @@ clone-response@^1.0.2:
dependencies: dependencies:
mimic-response "^1.0.0" mimic-response "^1.0.0"
code-oss-dev@cdr/vscode#8db6c9bb0bc065bdb905dc076f4d4234f126aff7: code-oss-dev@cdr/vscode#a1d3f915454bb88e508c269a3c5bafb3cfa6f9f6:
version "1.61.1" 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: dependencies:
"@microsoft/applicationinsights-web" "^2.6.4" "@microsoft/applicationinsights-web" "^2.6.4"
"@vscode/sqlite3" "4.0.12" "@vscode/sqlite3" "4.0.12"