Skip to content

Commit a517beb

Browse files
committed
fixup! fix(@angular/build): Add custom middleware for to present an Angular-tailored message
1 parent af24a02 commit a517beb

File tree

3 files changed

+40
-33
lines changed

3 files changed

+40
-33
lines changed

packages/angular/build/src/tools/vite/middlewares/host-check-middleware.ts

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,43 @@
66
* found in the LICENSE file at https://angular.dev/license
77
*/
88

9-
export function html403(hostname: string): string {
9+
import type { IncomingMessage, ServerResponse } from 'node:http';
10+
import type { Connect } from 'vite';
11+
12+
export function createAngularHostCheckMiddleware(middlewares: Connect.Server): void {
13+
const entry = middlewares.stack.find(
14+
({ handle }) =>
15+
typeof handle === 'function' && handle.name.startsWith('hostValidationMiddleware'),
16+
);
17+
18+
if (typeof entry?.handle !== 'function') {
19+
return;
20+
}
21+
22+
const originalHandle = entry.handle as Connect.NextHandleFunction;
23+
24+
entry.handle = function angularHostValidationMiddleware(
25+
req: IncomingMessage,
26+
res: ServerResponse,
27+
next: (err?: unknown) => void,
28+
) {
29+
originalHandle(
30+
req,
31+
{
32+
writeHead: (code) => {
33+
res.writeHead(code, { 'content-type': 'text/html' });
34+
},
35+
end: () => {
36+
const hostname = req.headers.host?.toLowerCase().split(':')[0] ?? '';
37+
res.end(html403(hostname));
38+
},
39+
} as ServerResponse,
40+
next,
41+
);
42+
};
43+
}
44+
45+
function html403(hostname: string): string {
1046
return `<!doctype html>
1147
<html>
1248
<head>

packages/angular/build/src/tools/vite/middlewares/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,4 @@ export {
1616
export { createAngularHeadersMiddleware } from './headers-middleware';
1717
export { createAngularComponentMiddleware } from './component-middleware';
1818
export { createChromeDevtoolsMiddleware } from './chrome-devtools-middleware';
19-
export { html403 } from './host-check-middleware';
19+
export { createAngularHostCheckMiddleware } from './host-check-middleware';

packages/angular/build/src/tools/vite/plugins/setup-middlewares-plugin.ts

Lines changed: 2 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,18 @@
66
* found in the LICENSE file at https://angular.dev/license
77
*/
88

9-
import { IncomingMessage, ServerResponse } from 'node:http';
109
import type { Connect, Plugin } from 'vite';
1110
import {
1211
ComponentStyleRecord,
1312
angularHtmlFallbackMiddleware,
1413
createAngularAssetsMiddleware,
1514
createAngularComponentMiddleware,
1615
createAngularHeadersMiddleware,
16+
createAngularHostCheckMiddleware,
1717
createAngularIndexHtmlMiddleware,
1818
createAngularSsrExternalMiddleware,
1919
createAngularSsrInternalMiddleware,
2020
createChromeDevtoolsMiddleware,
21-
html403,
2221
} from '../middlewares';
2322
import { AngularMemoryOutputFiles, AngularOutputAssets } from '../utils';
2423

@@ -113,35 +112,7 @@ export function createAngularSetupMiddlewaresPlugin(
113112
// before the built-in HTML middleware
114113
// eslint-disable-next-line @typescript-eslint/no-misused-promises
115114
return async () => {
116-
// Vite/Connect do not expose a typed stack, cast once to a precise structural type.
117-
const entry = server.middlewares.stack.find(
118-
({ handle }) =>
119-
typeof handle === 'function' && handle.name.startsWith('hostValidationMiddleware'),
120-
);
121-
122-
if (typeof entry?.handle === 'function') {
123-
const originalHandle = entry.handle as Connect.NextHandleFunction;
124-
125-
entry.handle = function angularHostValidationMiddleware(
126-
req: IncomingMessage,
127-
res: ServerResponse,
128-
next: (err?: unknown) => void,
129-
) {
130-
originalHandle(
131-
req,
132-
{
133-
writeHead: (code) => {
134-
res.writeHead(code, { 'content-type': 'text/html' });
135-
},
136-
end: () => {
137-
const hostname = req.headers.host?.toLowerCase().split(':')[0] ?? '';
138-
res.end(html403(hostname));
139-
},
140-
} as ServerResponse,
141-
next,
142-
);
143-
};
144-
}
115+
createAngularHostCheckMiddleware(server.middlewares);
145116

146117
if (ssrMode === ServerSsrMode.ExternalSsrMiddleware) {
147118
server.middlewares.use(

0 commit comments

Comments
 (0)