Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
c5ba588
Added punicode translation to default.monitor.hostname
iotux Jan 9, 2026
2923f6a
Added punicode translation to pingAsync
iotux Jan 9, 2026
febca21
Merge branch 'louislam:master' into fix/idn-ping-errors
iotux Jan 9, 2026
70400d6
Added comment to pingAsync
iotux Jan 9, 2026
69b40ea
Added comment to pingAsync
iotux Jan 9, 2026
0664642
Trigger re-check
iotux Jan 9, 2026
69d763a
Added IDN ping test
iotux Jan 10, 2026
1f9e922
test-idn-ping.js -> test/backend-test/test-util-server
iotux Jan 10, 2026
b2845b0
Solidified tests
iotux Jan 10, 2026
76747aa
[autofix.ci] apply automated fixes
autofix-ci[bot] Jan 10, 2026
9d50f3d
Merge branch 'louislam:master' into fix/idn-ping-errors
iotux Jan 10, 2026
d660507
Reworked tests
iotux Jan 10, 2026
261d772
Changed test IPv6 address because of the test "Network is unreachable…
iotux Jan 10, 2026
b67f9df
[autofix.ci] apply automated fixes
autofix-ci[bot] Jan 10, 2026
8b0325b
Added bracket stripping
iotux Jan 10, 2026
9c4db57
Corrected test to account for "Network unreachable" message
iotux Jan 10, 2026
92eb8c8
[autofix.ci] apply automated fixes
autofix-ci[bot] Jan 10, 2026
b2470ea
Refactor IPv6 error message assertions in tests
iotux Jan 10, 2026
4b56b25
[autofix.ci] apply automated fixes
autofix-ci[bot] Jan 10, 2026
d561f58
Fix regex for stripping brackets from destAddr
iotux Jan 10, 2026
9e66be2
Added MacOS specific workaround fur unusual error message
iotux Jan 11, 2026
bdfeee9
[autofix.ci] apply automated fixes
autofix-ci[bot] Jan 11, 2026
746f074
Removed redundant bracket stripping from destAddr
iotux Jan 11, 2026
18f57b4
Merge branch 'louislam:master' into fix/idn-ping-errors
iotux Jan 11, 2026
c78c492
Merge branch 'louislam:master' into fix/idn-ping-errors
iotux Jan 11, 2026
af19d21
Reverted defaultFriendlyName to previous behaviour
iotux Jan 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions server/util-server.js
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,16 @@ exports.pingAsync = function (
deadline = PING_GLOBAL_TIMEOUT_DEFAULT,
timeout = PING_PER_REQUEST_TIMEOUT_DEFAULT
) {
try {
const url = new URL(`http://${destAddr}`);
destAddr = url.hostname;
if (destAddr.startsWith("[") && destAddr.endsWith("]")) {
destAddr = destAddr.slice(1, -1);
}
} catch (e) {
// ignore
}

return new Promise((resolve, reject) => {
ping.promise
.probe(destAddr, {
Expand Down
57 changes: 57 additions & 0 deletions test/backend-test/test-util-server.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
const { describe, test } = require("node:test");
const assert = require("node:assert");
const { pingAsync } = require("../../server/util-server");

describe("Server Utilities: pingAsync", () => {
test("should convert IDN domains to Punycode before pinging", async () => {
const idnDomain = "münchen.de";
const punycodeDomain = "xn--mnchen-3ya.de";

await assert.rejects(pingAsync(idnDomain, false, 1, "", true, 56, 1, 1), (err) => {
if (err.message.includes("Parameter string not correctly encoded")) {
assert.fail("Ping failed with encoding error: IDN was not converted");
}
assert.ok(
err.message.includes(punycodeDomain),
`Error message should contain the Punycode domain "${punycodeDomain}". Got: ${err.message}`
);
return true;
});
});

test("should strip brackets from IPv6 addresses before pinging", async () => {
const ipv6WithBrackets = "[2606:4700:4700::1111]";
const ipv6Raw = "2606:4700:4700::1111";

await assert.rejects(pingAsync(ipv6WithBrackets, true, 1, "", true, 56, 1, 1), (err) => {
assert.strictEqual(
err.message.includes(ipv6WithBrackets),
false,
"Error message should not contain brackets"
);
// Allow either the IP in the message (local) OR "Network is unreachable"
const containsIP = err.message.includes(ipv6Raw);
const isUnreachable =
err.message.includes("Network is unreachable") || err.message.includes("Network unreachable");
// macOS error when IPv6 stack is missing
const isMacOSError = err.message.includes("nodename nor servname provided");
assert.ok(
containsIP || isUnreachable || isMacOSError,
`Ping failed correctly, but error message format was unexpected.\nGot: "${err.message}"\nExpected to contain IP "${ipv6Raw}" OR be a standard network error.`
);
return true;
});
});

test("should handle standard ASCII domains correctly", async () => {
const domain = "invalid-domain.test";
await assert.rejects(pingAsync(domain, false, 1, "", true, 56, 1, 1), (err) => {
assert.strictEqual(err.message.includes("Parameter string not correctly encoded"), false);
assert.ok(
err.message.includes(domain),
`Error message should contain the domain "${domain}". Got: ${err.message}`
);
return true;
});
});
});
Loading