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

fix: invalid ipv6 hostname on deno serve (#25482)

This PR fixes an invalid URL being printed when running `deno serve`

Before: invalid URL

```sh
$ deno serve --host localhost
deno serve: Listening on http://::1:8000/
```

After: valid URL

```sh
$ deno serve --host localhost
deno serve: Listening on http://[::1]:8000/
```
This commit is contained in:
Marvin Hagemeister 2024-09-06 11:22:52 +02:00 committed by GitHub
parent dcf155516b
commit 73ab32c551
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 39 additions and 8 deletions

View file

@ -583,7 +583,7 @@ type RawServeOptions = {
const kLoadBalanced = Symbol("kLoadBalanced");
function mapAnyAddrToLocalhostForWindows(hostname: string) {
function formatHostName(hostname: string): 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
@ -593,7 +593,9 @@ function mapAnyAddrToLocalhostForWindows(hostname: string) {
) {
return "localhost";
}
return hostname;
// Add brackets around ipv6 hostname
return StringPrototypeIncludes(hostname, ":") ? `[${hostname}]` : hostname;
}
function serve(arg1, arg2) {
@ -690,10 +692,8 @@ function serve(arg1, arg2) {
if (options.onListen) {
options.onListen(addr);
} else {
const hostname = mapAnyAddrToLocalhostForWindows(addr.hostname);
const host = StringPrototypeIncludes(hostname, ":")
? `[${hostname}]`
: hostname;
const host = formatHostName(addr.hostname);
// deno-lint-ignore no-console
console.log(`Listening on ${scheme}${host}:${addr.port}/`);
}
@ -868,10 +868,11 @@ function registerDeclarativeServer(exports) {
const nThreads = serveWorkerCount > 1
? ` with ${serveWorkerCount} threads`
: "";
const hostname_ = mapAnyAddrToLocalhostForWindows(hostname);
const host = formatHostName(hostname);
// deno-lint-ignore no-console
console.debug(
`%cdeno serve%c: Listening on %chttp://${hostname_}:${port}/%c${nThreads}`,
`%cdeno serve%c: Listening on %chttp://${host}:${port}/%c${nThreads}`,
"color: green",
"color: inherit",
"color: yellow",

View file

@ -872,6 +872,36 @@ Deno.test({ permissions: { net: true } }, async function validPortString() {
await server.shutdown();
});
Deno.test({ permissions: { net: true } }, async function ipv6Hostname() {
const ac = new AbortController();
let url = "";
const consoleLog = console.log;
console.log = (msg) => {
try {
const match = msg.match(/Listening on (http:\/\/(.*?):(\d+)\/)/);
assert(!!match, `Didn't match ${msg}`);
url = match[1];
} finally {
ac.abort();
}
};
try {
const server = Deno.serve({
handler: () => new Response(),
hostname: "::1",
port: 0,
signal: ac.signal,
});
assertEquals(server.addr.transport, "tcp");
assert(new URL(url), `Not a valid URL "${url}"`);
await server.shutdown();
} finally {
console.log = consoleLog;
}
});
Deno.test({ permissions: { net: true } }, function invalidPortFloat() {
assertThrows(
() =>