0
Fork 0
mirror of https://github.com/withastro/astro.git synced 2025-03-10 23:01:26 -05:00

fix: correctly handle wildcard hosts in preview (#514)

This commit is contained in:
Matt Kane 2025-01-22 14:19:05 +00:00 committed by GitHub
parent 90bb35100c
commit bce29643db
3 changed files with 15 additions and 11 deletions

View file

@ -5,21 +5,21 @@ import os from 'node:os';
import type { AstroIntegrationLogger } from 'astro';
import type { Options } from './types.js';
const wildcardHosts = new Set(['0.0.0.0', '::', '0000:0000:0000:0000:0000:0000:0000:0000']);
export async function logListeningOn(
logger: AstroIntegrationLogger,
server: http.Server | https.Server,
options: Pick<Options, 'host'>
configuredHost: string | boolean | undefined
) {
await new Promise<void>((resolve) => server.once('listening', resolve));
const protocol = server instanceof https.Server ? 'https' : 'http';
// Allow to provide host value at runtime
const host = getResolvedHostForHttpServer(
process.env.HOST !== undefined && process.env.HOST !== '' ? process.env.HOST : options.host
);
const host = getResolvedHostForHttpServer(configuredHost);
const { port } = server.address() as AddressInfo;
const address = getNetworkAddress(protocol, host, port);
if (host === undefined) {
if (host === undefined || wildcardHosts.has(host)) {
logger.info(
`Server listening on \n local: ${address.local[0]} \t\n network: ${address.network[0]}\n`
);
@ -28,7 +28,7 @@ export async function logListeningOn(
}
}
function getResolvedHostForHttpServer(host: string | boolean) {
function getResolvedHostForHttpServer(host: string | boolean | undefined) {
if (host === false) {
// Use a secure default
return 'localhost';
@ -47,8 +47,6 @@ interface NetworkAddressOpt {
network: string[];
}
const wildcardHosts = new Set(['0.0.0.0', '::', '0000:0000:0000:0000:0000:0000:0000:0000']);
// this code from vite https://github.com/vitejs/vite/blob/d09bbd093a4b893e78f0bbff5b17c7cf7821f403/packages/vite/src/node/utils.ts#L892-L914
export function getNetworkAddress(
// biome-ignore lint/style/useDefaultParameterLast: <explanation>

View file

@ -35,7 +35,13 @@ const createPreviewServer: CreatePreviewServer = async (preview) => {
throw err;
}
}
const host = preview.host ?? 'localhost';
// If the user didn't specify a host, it will already have been defaulted to
// "localhost" by getResolvedHostForHttpServer in astro core/preview/util.ts.
// The value `undefined` actually means that either the user set `options.server.host`
// to `true`, or they passed `--host` without an argument. In that case, we
// should listen on all IPs.
const host = process.env.HOST ?? preview.host ?? '0.0.0.0';
const port = preview.port ?? 4321;
const server = createServer(ssrHandler, host, port);
@ -51,7 +57,7 @@ const createPreviewServer: CreatePreviewServer = async (preview) => {
});
}
logListeningOn(preview.logger, server.server, options);
logListeningOn(preview.logger, server.server, host);
await new Promise<void>((resolve, reject) => {
server.server.once('listening', resolve);
server.server.once('error', reject);

View file

@ -24,7 +24,7 @@ export default function standalone(app: NodeApp, options: Options) {
const server = createServer(handler, host, port);
server.server.listen(port, host);
if (process.env.ASTRO_NODE_LOGGING !== 'disabled') {
logListeningOn(app.getAdapterLogger(), server.server, options);
logListeningOn(app.getAdapterLogger(), server.server, host);
}
return {
server,