1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-22 07:14:47 -05:00

fix(ext/http): do not set localhost to hostname unnecessarily (#24777)

This commit changes when to cause the hostname substition of `0.0.0.0` ->
`localhost`.

Currently we substitute `localhost` to the hostname on windows before
calling `options.onListen`, which prevents the users to do more advanced
thing using hostname string like
https://github.com/denoland/std/issues/5558. This PR changes it not to
substitute it when the user provide `onListen` callback.

closes #24776
unblocks https://github.com/denoland/std/issues/5558
This commit is contained in:
Yoshiya Hinosawa 2024-09-05 14:13:06 +09:00 committed by GitHub
parent 186f7484da
commit e799c2857c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 36 additions and 12 deletions

View file

@ -583,6 +583,19 @@ type RawServeOptions = {
const kLoadBalanced = Symbol("kLoadBalanced");
function mapAnyAddrToLocalhostForWindows(hostname: string) {
// If the hostname is "0.0.0.0", we display "localhost" in console
// because browsers in Windows don't resolve "0.0.0.0".
// See the discussion in https://github.com/denoland/deno_std/issues/1165
if (
(Deno.build.os === "windows") &&
(hostname == "0.0.0.0" || hostname == "::")
) {
return "localhost";
}
return hostname;
}
function serve(arg1, arg2) {
let options: RawServeOptions | undefined;
let handler: RawHandler | undefined;
@ -672,22 +685,15 @@ function serve(arg1, arg2) {
}
const addr = listener.addr;
// If the hostname is "0.0.0.0", we display "localhost" in console
// because browsers in Windows don't resolve "0.0.0.0".
// See the discussion in https://github.com/denoland/deno_std/issues/1165
const hostname = (addr.hostname == "0.0.0.0" || addr.hostname == "::") &&
(Deno.build.os === "windows")
? "localhost"
: addr.hostname;
addr.hostname = hostname;
const onListen = (scheme) => {
if (options.onListen) {
options.onListen(addr);
} else {
const host = StringPrototypeIncludes(addr.hostname, ":")
? `[${addr.hostname}]`
: addr.hostname;
const hostname = mapAnyAddrToLocalhostForWindows(addr.hostname);
const host = StringPrototypeIncludes(hostname, ":")
? `[${hostname}]`
: hostname;
// deno-lint-ignore no-console
console.log(`Listening on ${scheme}${host}:${addr.port}/`);
}
@ -862,9 +868,10 @@ function registerDeclarativeServer(exports) {
const nThreads = serveWorkerCount > 1
? ` with ${serveWorkerCount} threads`
: "";
const hostname_ = mapAnyAddrToLocalhostForWindows(hostname);
// deno-lint-ignore no-console
console.debug(
`%cdeno serve%c: Listening on %chttp://${hostname}:${port}/%c${nThreads}`,
`%cdeno serve%c: Listening on %chttp://${hostname_}:${port}/%c${nThreads}`,
"color: green",
"color: inherit",
"color: yellow",

View file

@ -4191,3 +4191,19 @@ Deno.test({
'Operation `"op_net_listen_unix"` not supported on non-unix platforms.',
);
});
Deno.test({
name: "onListen callback gets 0.0.0.0 hostname as is",
}, async () => {
const { promise, resolve } = Promise.withResolvers<{ hostname: string }>();
const server = Deno.serve({
handler: (_) => new Response("ok"),
hostname: "0.0.0.0",
port: 0,
onListen: resolve,
});
const { hostname } = await promise;
assertEquals(hostname, "0.0.0.0");
await server.shutdown();
});

View file

@ -79,6 +79,7 @@ Deno.test("[node/net] net.connect().unref() works", async () => {
port: 0, // any available port will do
handler: () => new Response("hello"),
onListen: async ({ port, hostname }) => {
hostname = Deno.build.os === "windows" ? "localhost" : hostname;
const { stdout, stderr } = await new Deno.Command(Deno.execPath(), {
args: [
"eval",