feat: use --app-name in error page title

- Replace hardcoded 'code-server' with {{APP_NAME}} template in error.html
- Add APP_NAME replacement in errors.ts using req.args['app-name']
- Add tests for custom app-name and default value
This commit is contained in:
RyanAI 2026-03-05 03:11:03 +08:00
parent 62afaf261b
commit f3ae74b223
3 changed files with 41 additions and 3 deletions

View file

@ -11,7 +11,7 @@
content="style-src 'self'; manifest-src 'self'; img-src 'self' data:; font-src 'self' data:;" content="style-src 'self'; manifest-src 'self'; img-src 'self' data:; font-src 'self' data:;"
/> />
<meta name="color-scheme" content="light dark" /> <meta name="color-scheme" content="light dark" />
<title>{{ERROR_TITLE}} - code-server</title> <title>{{ERROR_TITLE}} - {{APP_NAME}}</title>
<link rel="icon" href="{{CS_STATIC_BASE}}/src/browser/media/favicon-dark-support.svg" /> <link rel="icon" href="{{CS_STATIC_BASE}}/src/browser/media/favicon-dark-support.svg" />
<link rel="alternate icon" href="{{CS_STATIC_BASE}}/src/browser/media/favicon.ico" /> <link rel="alternate icon" href="{{CS_STATIC_BASE}}/src/browser/media/favicon.ico" />
<link rel="manifest" href="/manifest.json" crossorigin="use-credentials" /> <link rel="manifest" href="/manifest.json" crossorigin="use-credentials" />

View file

@ -57,7 +57,8 @@ export const errorHandler: express.ErrorRequestHandler = async (err, req, res, n
replaceTemplates(req, content) replaceTemplates(req, content)
.replace(/{{ERROR_TITLE}}/g, statusCode.toString()) .replace(/{{ERROR_TITLE}}/g, statusCode.toString())
.replace(/{{ERROR_HEADER}}/g, statusCode.toString()) .replace(/{{ERROR_HEADER}}/g, statusCode.toString())
.replace(/{{ERROR_BODY}}/g, escapeHtml(err.message)), .replace(/{{ERROR_BODY}}/g, escapeHtml(err.message))
.replace(/{{APP_NAME}}/g, (req.args && req.args["app-name"]) || "code-server"),
) )
} else { } else {
res.json({ res.json({

View file

@ -20,9 +20,45 @@ describe("error page is rendered for text/html requests", () => {
expect(res.status).toHaveBeenCalledWith(404) expect(res.status).toHaveBeenCalledWith(404)
expect(res.send).toHaveBeenCalledWith(expect.not.stringContaining("<script>")) expect(res.send).toHaveBeenCalledWith(expect.not.stringContaining("<script>"))
}) })
it("should use custom app-name in error page title", async () => {
const err = {
statusCode: 404,
message: "Not found",
}
const req = createRequest({ "app-name": "MyCodeServer" })
const res = {
status: jest.fn().mockReturnValue(this),
send: jest.fn().mockReturnValue(this),
set: jest.fn().mockReturnValue(this),
} as unknown as express.Response
await errorHandler(err, req, res, jest.fn())
expect(res.send).toHaveBeenCalledWith(
expect.stringContaining("<title>404 - MyCodeServer</title>"),
)
})
it("should use default 'code-server' when app-name is not set", async () => {
const err = {
statusCode: 500,
message: "Internal error",
}
const req = createRequest()
const res = {
status: jest.fn().mockReturnValue(this),
send: jest.fn().mockReturnValue(this),
set: jest.fn().mockReturnValue(this),
} as unknown as express.Response
await errorHandler(err, req, res, jest.fn())
expect(res.send).toHaveBeenCalledWith(
expect.stringContaining("<title>500 - code-server</title>"),
)
})
}) })
function createRequest(): express.Request { function createRequest(args?: Record<string, string>): express.Request {
return { return {
headers: { headers: {
accept: ["text/html"], accept: ["text/html"],
@ -31,5 +67,6 @@ function createRequest(): express.Request {
query: { query: {
to: "test", to: "test",
}, },
args: args,
} as unknown as express.Request } as unknown as express.Request
} }