Skip to content

Commit f3ae74b

Browse files
RyanAIRyanAI
authored andcommitted
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
1 parent 62afaf2 commit f3ae74b

File tree

3 files changed

+41
-3
lines changed

3 files changed

+41
-3
lines changed

src/browser/pages/error.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
content="style-src 'self'; manifest-src 'self'; img-src 'self' data:; font-src 'self' data:;"
1212
/>
1313
<meta name="color-scheme" content="light dark" />
14-
<title>{{ERROR_TITLE}} - code-server</title>
14+
<title>{{ERROR_TITLE}} - {{APP_NAME}}</title>
1515
<link rel="icon" href="{{CS_STATIC_BASE}}/src/browser/media/favicon-dark-support.svg" />
1616
<link rel="alternate icon" href="{{CS_STATIC_BASE}}/src/browser/media/favicon.ico" />
1717
<link rel="manifest" href="/manifest.json" crossorigin="use-credentials" />

src/node/routes/errors.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@ export const errorHandler: express.ErrorRequestHandler = async (err, req, res, n
5757
replaceTemplates(req, content)
5858
.replace(/{{ERROR_TITLE}}/g, statusCode.toString())
5959
.replace(/{{ERROR_HEADER}}/g, statusCode.toString())
60-
.replace(/{{ERROR_BODY}}/g, escapeHtml(err.message)),
60+
.replace(/{{ERROR_BODY}}/g, escapeHtml(err.message))
61+
.replace(/{{APP_NAME}}/g, (req.args && req.args["app-name"]) || "code-server"),
6162
)
6263
} else {
6364
res.json({

test/unit/node/routes/errors.test.ts

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,45 @@ describe("error page is rendered for text/html requests", () => {
2020
expect(res.status).toHaveBeenCalledWith(404)
2121
expect(res.send).toHaveBeenCalledWith(expect.not.stringContaining("<script>"))
2222
})
23+
24+
it("should use custom app-name in error page title", async () => {
25+
const err = {
26+
statusCode: 404,
27+
message: "Not found",
28+
}
29+
const req = createRequest({ "app-name": "MyCodeServer" })
30+
const res = {
31+
status: jest.fn().mockReturnValue(this),
32+
send: jest.fn().mockReturnValue(this),
33+
set: jest.fn().mockReturnValue(this),
34+
} as unknown as express.Response
35+
36+
await errorHandler(err, req, res, jest.fn())
37+
expect(res.send).toHaveBeenCalledWith(
38+
expect.stringContaining("<title>404 - MyCodeServer</title>"),
39+
)
40+
})
41+
42+
it("should use default 'code-server' when app-name is not set", async () => {
43+
const err = {
44+
statusCode: 500,
45+
message: "Internal error",
46+
}
47+
const req = createRequest()
48+
const res = {
49+
status: jest.fn().mockReturnValue(this),
50+
send: jest.fn().mockReturnValue(this),
51+
set: jest.fn().mockReturnValue(this),
52+
} as unknown as express.Response
53+
54+
await errorHandler(err, req, res, jest.fn())
55+
expect(res.send).toHaveBeenCalledWith(
56+
expect.stringContaining("<title>500 - code-server</title>"),
57+
)
58+
})
2359
})
2460

25-
function createRequest(): express.Request {
61+
function createRequest(args?: Record<string, string>): express.Request {
2662
return {
2763
headers: {
2864
accept: ["text/html"],
@@ -31,5 +67,6 @@ function createRequest(): express.Request {
3167
query: {
3268
to: "test",
3369
},
70+
args: args,
3471
} as unknown as express.Request
3572
}

0 commit comments

Comments
 (0)