Skip to content

node:url: strip tab and newline before the bracket and port checks in domainToASCII/domainToUnicode - #39415

Open
robobun wants to merge 3 commits into
mainfrom
farm/4f01cae2/port-idna-url-tests
Open

node:url: strip tab and newline before the bracket and port checks in domainToASCII/domainToUnicode#39415
robobun wants to merge 3 commits into
mainfrom
farm/4f01cae2/port-idna-url-tests

Conversation

@robobun

@robobun robobun commented Aug 17, 2026

Copy link
Copy Markdown
Collaborator

Problem

Fix

  • parseDomainAsHost strips tab, LF and CR from the input before the terminator scan and the bracket / : / @ checks. That is the order the host parse Node runs (ada's set_hostname) uses; for the 24 tab/newline inputs in the details block Bun now prints the same as Node 26.7 byte for byte. Inputs without those characters take removeCharacters' no-copy path and are unaffected; the other callers of the two functions (url.format, fileURLToPath) pass hostnames taken from parsed URLs, which never contain them.
  • test/js/node/url/url-domain-ascii-unicode.test.js: the new "\t[::1]", "[::1]\n" and "\t[::1]\r\n" rows fail on main ("") and pass with the change. The rest of the hostParserParity table pins the host-parse semantics of domainToASCII/domainToUnicode that nothing on main covered: percent-decoding before IDNA, forbidden code points, IPv4 and IPv6 canonicalization, the / ? # \ terminators, port and userinfo failing, direct domainToUnicode outputs. The existing domainToUnicode invalid-input loop called domainToASCII; it now calls domainToUnicode. A Unicode 16 test is added under the same process.versions.icu < 76 skip the other Unicode 16 tests use.
  • test/js/web/url/url.test.ts: more Unicode 16 code points in the existing test, plus a table of hosts that must keep parsing: valid xn-- labels, a label that merely contains xn--, xn-- in userinfo / path / query / fragment, and opaque hosts of non-special schemes.
  • Scope note: the tables deliberately contain no row asserting that an all-ASCII host with an invalid xn-- label is rejected. The URL Standard (whatwg/url a8d5ca3716), WPT (b63305b743) and ada 4.0, shipped in Node 26.7, changed in June to August to accept such hosts (domainToASCII("xn--a") is "xn--a" in Node 26.7, "" in 26.3). Bun's hasValidPunycodeHost from node compat batch: callback-throw dispatch, Assert class + native deep-equality parity, Intl gate + URL/buffer fallout, compile cache, watch kill-signal, profilers (+98 tests) #34660 still rejects them, as do the WPT fixtures vendored from Node 26.3, so adding more tests for the rejection would only make following upstream harder; whether to follow it is a separate decision (it also affects url: give blob: URLs a null origin when the inner host has invalid punycode #39404). Every expected value in this PR holds in Node 26.3 and Node 26.7 (checked with both binaries).
  • Verified: bun bd test test/js/node/url/url-domain-ascii-unicode.test.js (200 pass; 3 fail without the NodeURL.cpp change), bun bd test test/js/web/url/url.test.ts (25 pass), the vendored test-url-domain-ascii-unicode.js, test-whatwg-url-custom-domainto.js, test-whatwg-url-toascii.js, test-url-fileurltopath.js and test-url-format-whatwg.js pass. bun bd test test/js/node/url test/js/web/url has one failure, the pre-existing url-canParse-whatwg.test.js 5s timeout under the debug build, identical without this change.
  • Not changed here: url.hostname = "\t[::1]" (and url.host =) is still a no-op in Bun while Node sets [::1]; that one is inside WTF::URL::setHost, a different code path, and everything else in that area ("\texample.com", "[::1]\n", "\t[::1]:81") already matches.

Background

  • url.domainToASCII / domainToUnicode are defined by Node as: take a ws://x URL, set its hostname to the input, return the resulting hostname, or "" if the setter failed. That is why percent-decoding, IP address canonicalization, the authority terminators and tab/newline removal all show up in their results. Bun implements the same thing in parseDomainAsHost with a few pre-checks in front of WTF::URL (the hostname setter rejects ports, and a@b would otherwise parse as userinfo).
  • Basic URL parser: the WHATWG algorithm behind new URL() and the setters. Its first step removes every ASCII tab, LF and CR from the input; everything after that, including the host parser, never sees them.
  • Punycode / xn-- label: the ASCII form of an internationalized label. UTS Bun v0.0.41 #46 defines which ones are valid; a non-ASCII host still goes through full UTS Bun v0.0.41 #46 processing everywhere (Bun, Node 26.3, Node 26.7), which is what the table's xn--te\u0161la row pins. What changed upstream is only the treatment of hosts that are entirely ASCII.
  • Unicode 16 changed the UTS Bun v0.0.41 #46 status of some code points from disallowed to mapped or ignored; ICU 76 is the first release with that table. Linux and Windows builds bundle ICU 78, macOS links the system ICU, so those assertions skip when process.versions.icu is older.
domainToASCII / domainToUnicode with tab and newline, before and after (Node 26.3 and 26.7 agree with the "after" column on every line)
input              before           after
"\t[::1]"          "" / ""          "[::1]" / "[::1]"
"\n[::1]"          "" / ""          "[::1]" / "[::1]"
"\r[::1]"          "" / ""          "[::1]" / "[::1]"
"[::1]\t"          "" / ""          "[::1]" / "[::1]"
"[::1]\n"          "" / ""          "[::1]" / "[::1]"
"[::1]\r\n"        "" / ""          "[::1]" / "[::1]"
"\t[::1]\n"        "" / ""          "[::1]" / "[::1]"
"[\t::1]"          "[::1]"          unchanged
"[::1\t]"          "[::1]"          unchanged
"[::\n1]"          "[::1]"          unchanged
"\t[::1]:80"       ""               unchanged (port still fails)
"[::1]\t:80"       ""               unchanged
"a\t:80"           ""               unchanged
"a\t@b"            ""               unchanged
"\t0x7f.1"         "127.0.0.1"      unchanged
"0x7f.1\n"         "127.0.0.1"      unchanged
"\texample.com"    "example.com"    unchanged
"example.com\n"    "example.com"    unchanged
"\t[", "[\n", "\t[:", "\t", "\n", "\t\n\r"   ""   unchanged

[review] gate passed · iteration 0 · 3 files touched

fails on main (without fix)
ASAN without fix: 3 FAILED
$ BUN_DEBUG_QUIET_LOGS=1 bun scripts/build.ts --profile=debug --quiet test "--reporter=junit" "--reporter-outfile=/tmp/mechgate.xml" test/js/node/url/url-domain-ascii-unicode.test.js test/js/web/url/url.test.ts
bun test v1.4.0 (8326d1bd3)

test/js/web/url/url.test.ts:
(pass) url > URL throws [11.43ms]
(pass) url > ERR_INVALID_URL carries input and, when given, base [9.36ms]
(pass) url > should have correct origin and protocol [11.46ms]
(pass) url > blob urls [7.25ms]
(pass) url > leaves opaque (non-special-scheme) hosts unchanged [7.93ms]
(pass) url > special-scheme hosts use the Unicode 16 IDNA table [8.66ms]
(pass) url > keeps valid xn-- labels, and hosts that only contain the letters xn-- [8.51ms]
(pass) url > rejects invalid punycode labels however they are spelled in the input (like Node) [21.00ms]
(pass) url > prints [98.54ms]
(pass) url > URLContext offsets account for the /. pathname guard [45.74ms]
(pass) url > works [12.51ms]
(pass) url > URL.canParse > URL.canParse(undefined, undefined) [1.59ms]
(pass) url > URL.canParse > URL.canParse(a:b, undefined) [0.35ms]
(pass) url > URL.canParse > URL.canParse(undefined, a:b) [0.62ms]
(pass) url > URL.canParse > UR
... (truncated)

release without fix: all passed
bun test v1.4.0-canary.1 (5be43fb35)

test/js/web/url/url.test.ts:
(pass) url > URL throws [0.14ms]
(pass) url > ERR_INVALID_URL carries input and, when given, base [0.12ms]
(pass) url > should have correct origin and protocol [0.10ms]
(pass) url > blob urls [0.06ms]
(pass) url > leaves opaque (non-special-scheme) hosts unchanged [0.08ms]
(pass) url > special-scheme hosts use the Unicode 16 IDNA table [0.14ms]
(pass) url > keeps valid xn-- labels, and hosts that only contain the letters xn-- [0.11ms]
(pass) url > rejects invalid punycode labels however they are spelled in the input (like Node) [0.21ms]
(pass) url > prints [1.88ms]
(pass) url > URLContext offsets account for the /. pathname guard [0.68ms]
(pass) url > works [0.13ms]
(pass) url > URL.canParse > URL.canParse(undefined, undefined) [0.02ms]
(pass) url > URL.canParse > URL.canParse(a:b, undefined)
(pass) url > URL.canParse > URL.canParse(undefined, a:b)
(pass) url > URL.canParse > URL.canParse(a:/b, undefined)
(pass) url > URL.canParse > URL.canParse(undefined, a:/b)
(pass) url > URL.canParse > URL.canParse(https://test:test, undefined)
(pass) url > URL.canParse > URL.canParse(a, https://b/)
(pass) url > 
... (truncated)
passes on PR (with fix)
ASAN with fix: all passed
$ BUN_DEBUG_QUIET_LOGS=1 bun scripts/build.ts --profile=debug --quiet test "--reporter=junit" "--reporter-outfile=/tmp/mechgate.xml" test/js/node/url/url-domain-ascii-unicode.test.js test/js/web/url/url.test.ts
bun test v1.4.0 (8326d1bd3)

test/js/web/url/url.test.ts:
(pass) url > URL throws [11.30ms]
(pass) url > ERR_INVALID_URL carries input and, when given, base [9.41ms]
(pass) url > should have correct origin and protocol [11.40ms]
(pass) url > blob urls [7.45ms]
(pass) url > leaves opaque (non-special-scheme) hosts unchanged [7.61ms]
(pass) url > special-scheme hosts use the Unicode 16 IDNA table [8.69ms]
(pass) url > keeps valid xn-- labels, and hosts that only contain the letters xn-- [8.35ms]
(pass) url > rejects invalid punycode labels however they are spelled in the input (like Node) [20.93ms]
(pass) url > prints [98.48ms]
(pass) url > URLContext offsets account for the /. pathname guard [45.20ms]
(pass) url > works [12.24ms]
(pass) url > URL.canParse > URL.canParse(undefined, undefined) [1.65ms]
(pass) url > URL.canParse > URL.canParse(a:b, undefined) [0.32ms]
(pass) url > URL.canParse > URL.canParse(undefined, a:b) [0.27ms]
(pass) url > URL.canParse > UR
... (truncated)

release with fix: all passed
$ bun scripts/build.ts --profile=release
[configured] bun-profile → bun (stripped)
  target       linux-x64-gnu
  build type   Release
  build dir    ./build/release
  revision     15eb75fb92
  features     baseline

22 deps, 120 codegen, 1175 objects in 635ms

ninja: Entering directory `/workspace/bun/build/release'
[1/13] cxx obj/unified/UnifiedSource-src_jsc_bindings-4.cpp.o
[2/13] cxx obj/unified/UnifiedSource-src_jsc_bindings-1.cpp.o
[3/13] cxx obj/src/jsc/bindings/bindings.cpp.o
[4/13] cxx obj/unified/UnifiedSource-src_jsc_bindings-0.cpp.o
[5/13] cxx obj/src/jsc/bindings/ZigGlobalObject.cpp.o
[6/13] cxx obj/unified/UnifiedSource-src_jsc_bindings-3.cpp.o
[7/13] gen generated_host_exports.rs
generated_host_exports.rs: 92 exports (host=3, lazy=10, generic=79, rust=0); 241 extern-C blocks audited
[8/13] gen cpp.rs (cppbind)
[8/13] cargo bun_bin → libbun_rust.a (--target x86_64-unknown-linux-gnu)

  nightly-2026-07-20-x86_64-unknown-linux-gnu unchanged - rustc 1.99.0-nightly (9f36de775 2026-07-19)

�[1m�[92m   Compiling�[0m std v0.0.0 (/root/.rustup/toolchains/nightly-2026-07-20-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std)
�[1m�[92m   Compiling�[0
... (truncated)
diff hotspot
src/jsc/bindings/NodeURL.cpp                      |   5 +-
 test/js/node/url/url-domain-ascii-unicode.test.js | 118 +++++++++++++++++++++-
 test/js/web/url/url.test.ts                       |  32 ++++++
 3 files changed, 153 insertions(+), 2 deletions(-)

gate history · 2 passed · 0 rejected · iteration 0

evidence per changed file
file                                               reads  edits  tests
src/jsc/bindings/NodeURL.cpp                           3      4      0
test/js/node/url/url-domain-ascii-unicode.test.js      4      6      0
test/js/web/url/url.test.ts                            4      6      0

@coderabbitai

coderabbitai Bot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: e1764e2b-104d-4903-8b0c-d9d6b6587b23

📥 Commits

Reviewing files that changed from the base of the PR and between 5c050bc and 5be43fb.

📒 Files selected for processing (3)
  • src/jsc/bindings/NodeURL.cpp
  • test/js/node/url/url-domain-ascii-unicode.test.js
  • test/js/web/url/url.test.ts

Included review availability: Your plan includes up to 5 reviews per rolling hour; 0 remain after this review.


Walkthrough

The change strips selected ASCII whitespace before host parsing and adds parity coverage for domain conversion and URL hostname handling, including UTS #46 mappings, punycode, normalization, delimiters, and non-special schemes.

Changes

URL host parsing parity

Layer / File(s) Summary
Host normalization and domain conversion tests
src/jsc/bindings/NodeURL.cpp, test/js/node/url/url-domain-ascii-unicode.test.js
parseDomainAsHost removes tab, newline, and carriage-return characters. Domain conversion tests cover WHATWG host parsing and ICU-gated UTS #46 mappings.
URL hostname behavior
test/js/web/url/url.test.ts
Hostname tests cover UTS #46 mappings, ignored format controls, label separators, valid and invalid xn-- labels, and non-special schemes.

Suggested reviewers: cirospaciari, jarred-sumner

🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title clearly describes the main source change: stripping tab and newline characters before domain host validation.
Description check ✅ Passed The description explains the problem, fix, scope, and verification results, although it uses different headings from the template.

Comment @coderabbitai help to get the list of available commands.

@robobun

robobun commented Aug 17, 2026

Copy link
Copy Markdown
Collaborator Author

Status: ready for review.

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — test-only additions salvaging coverage from three superseded PRs, plus a fix for the domainToUnicode invalid-input loop that was accidentally calling domainToASCII.

What was reviewed:

  • Verified the invalids table values ("@", "a@b", null, undefined, bare IPv6) hold for domainToUnicode too, so the one-line fix doesn't break existing assertions.
  • Checked test conventions: Buffer.alloc(n, fill).toString() for long strings, JSON.stringify(input) for unique test names, existing parseInt(process.versions.icu) < 76 skip pattern reused, tests appended to existing files.
  • Checked for flakiness sources — no sleeps, no network, no timing assertions; all data-driven toEqual/toBe on fixed inputs.
Extended reasoning...

Overview

Test-only PR touching two files: test/js/node/url/url-domain-ascii-unicode.test.js and test/js/web/url/url.test.ts. It adds a ~75-row hostParserParity table exercising domainToASCII/domainToUnicode as a full WHATWG host parse (percent-decoding, forbidden code points, IPv4/IPv6 canonicalization, tab/newline stripping, authority terminators, invalid punycode), a >256-code-unit host test to cover the runUIDNA U_BUFFER_OVERFLOW_ERROR retry, a Unicode 16 UTS #46 test under an ICU-version skip, and four new URL tests covering invalid xn-- labels across all six special schemes, the href/host/hostname setters, and valid/non-punycode xn-- substrings. It also fixes a copy-paste bug where the domainToUnicode invalid-input loop was calling domainToASCII.

Security risks

None. No runtime code is touched; only test assertions are added.

Level of scrutiny

Low-to-medium. The change is purely additive test coverage plus a one-line test fix. The main risk is a wrong expected value causing CI to go red on some platform, and the PR description addresses this directly: every expected value was cross-checked against Node 26.3, both files pass on main (bun bd test, 210 + 28 pass), and the tests were mutation-tested by stubbing hasValidPunycodeHost to confirm they fail when the code they cover is broken. The Unicode 16 assertions are correctly gated behind parseInt(process.versions.icu) < 76 (matching the pre-existing pattern in the same file) so macOS with older system ICU won't fail.

Other factors

  • Repo test conventions are followed: Buffer.alloc(1000, "a").toString() instead of "a".repeat(1000); tests added to existing files rather than new ones; exact-value assertions via toEqual on {ascii, unicode} objects (single failure shows both values); JSON.stringify(input) produces unique test names for control-character inputs.
  • The one-line domainToASCIIdomainToUnicode fix in the existing invalid-input loop is safe: the five invalids entries ("@", "a@b", null"null", undefined"undefined", bare IPv6→"") produce identical results under both functions, so the assertion values remain correct.
  • No hermeticity concerns: no subprocesses, no network, no filesystem, no timing.
  • No prior human review comments to address; only a CodeRabbit rate-limit notice on the timeline.

Comment thread src/jsc/bindings/NodeURL.cpp Outdated
@coderabbitai

coderabbitai Bot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Note

The previously reviewed commits are no longer reachable (likely due to a force-push or rebase), so CodeRabbit is performing a full review instead of an incremental one. This review may take a little longer.

@robobun robobun changed the title url: add host parsing and invalid punycode test cases for domainToASCII and URL node:url: strip tab and newline before the bracket and port checks in domainToASCII/domainToUnicode Aug 17, 2026
Comment thread test/js/node/url/url-domain-ascii-unicode.test.js

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — the description now matches the diff (my earlier nit is addressed), and the 3-line parseDomainAsHost change plus test additions look correct.

What was reviewed:

  • removeCharacters strips tab/LF/CR before the bracket/:/@ checks, matching the basic URL parser's first step; inputs without those chars hit the no-copy path.
  • The domainToUnicode invalids loop was calling domainToASCII — now fixed; both functions share the same invalids expected values so the assertion still holds.
  • New hostParserParity rows and the url.test.ts additions are additive, ICU-76-gated where needed, and avoid pinning the all-ASCII xn-- rejection that Node 26.7 changed.
Extended reasoning...

Overview

Three files: a 3-line change to parseDomainAsHost in src/jsc/bindings/NodeURL.cpp (rename the parameter to input, strip \t/\n/\r via WTF::String::removeCharacters into domain before the existing terminator scan and bracket/port/userinfo checks), ~115 lines of new test rows in test/js/node/url/url-domain-ascii-unicode.test.js (a hostParserParity table, a Unicode 16 block behind process.versions.icu < 76, and a fix for the existing domainToUnicode invalids loop that was calling domainToASCII), and ~32 lines in test/js/web/url/url.test.ts (more Unicode 16 code points in the existing ICU-gated test, plus one new it() for valid xn-- labels and opaque-host schemes).

Security risks

None identified. The strip runs before the pre-checks, which only makes domainToASCII/domainToUnicode accept inputs like "\t[::1]" that WTF::URL (and Node, and the WHATWG basic URL parser) already accept — Bun's own new URL("ws://\t[::1]/") already parsed these. The only other callers reach parseDomainAsHost via jsDomainToASCII/jsDomainToUnicode with user-supplied strings; url.format and fileURLToPath pass hostnames taken from already-parsed URLs, which never contain tab/newline.

Level of scrutiny

Low-to-moderate. The native change is a single spec-step reorder in a Node-compat helper; removeCharacters returns the receiver unchanged when nothing matches, so the common path is unaffected. The bulk of the diff is test coverage with expected values checked against Node 26.3 and 26.7, and the evidence block confirms 3 rows fail on main and pass with the fix under both ASAN-debug and release.

Other factors

Since my previous review the PR description was rewritten to drop the long-host / "four tests" claims I flagged, so that nit is resolved without code changes. The comment-cop feedback on the long inline comment was addressed in 5be43fb (now a one-line spec citation). The scope note deliberately avoids adding rows that pin all-ASCII invalid-xn-- rejection, which diverged between Node 26.3 and 26.7 — that keeps the new tests stable across the upstream change. No outstanding reviewer comments remain.

…II and URL

Ports the test tables from the superseded #33201, #34731 and #33206 that
current tests did not cover: domainToASCII/domainToUnicode host parsing
(percent-decoding, IPv4/IPv6, authority terminators, tab and newline
stripping, invalid punycode), punycode labels that decode to disallowed
code points across every special scheme, the setters, hosts longer than
the IDNA conversion's initial buffer, and more of the Unicode 16 UTS #46
reclassifications. Also makes the domainToUnicode invalid-input loop call
domainToUnicode instead of domainToASCII.
… domainToASCII/domainToUnicode

parseDomainAsHost looked for the IPv6 brackets and for ':' / '@' in the raw
input, so a tab or newline next to the brackets failed the host even though
the URL parser removes those characters first; Node returns the address.

The test tables are reduced to the rows whose expected values hold in both
Node 26.3 and Node 26.7: ada 4.0 (Node 26.7), the URL Standard and WPT no
longer fail all-ASCII hosts with invalid xn-- labels, so the rows pinning
that rejection, and the long-host tests built on it, are dropped.
@robobun
robobun force-pushed the farm/4f01cae2/port-idna-url-tests branch from 5be43fb to 15eb75f Compare August 17, 2026 14:01

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — the description now matches the diff (my earlier nit is addressed), and the two-line removeCharacters strip in parseDomainAsHost is the spec-correct ordering.

What was reviewed:

  • removeCharacters predicate matches exactly the WHATWG "ASCII tab or newline" set (\t, \n, \r); no-match inputs take the no-copy path, and the lambda works for both 8-bit and 16-bit WTF strings.
  • parseDomainAsHost is file-static with only jsDomainToASCII/jsDomainToUnicode as callers; the sibling url.hostname setter gap is called out as a separate WTF::URL issue.
  • The domainToUnicode invalid-input loop fix (was calling domainToASCII) — the invalids table's expected values hold for both functions, so the corrected loop still passes.
  • The hostParserParity table deliberately omits all-ASCII invalid-xn-- rejection rows per the scope note (Node 26.3 vs 26.7 divergence) — no test locks in behaviour that's about to change upstream.
Extended reasoning...

Overview

Two-line native change in src/jsc/bindings/NodeURL.cpp: parseDomainAsHost now strips ASCII tab, LF and CR from its input before running the terminator scan and the [/]/:/@ pre-checks, so domainToASCII("\t[::1]") and domainToUnicode("[::1]\n") return "[::1]" instead of "", matching Node and Bun's own new URL(). The rest is test coverage: a ~60-row hostParserParity table in url-domain-ascii-unicode.test.js (three rows fail on main), a fix to the existing domainToUnicode invalid-input loop that was accidentally calling domainToASCII, an ICU-76-gated Unicode 16 block, and one new + one extended test in url.test.ts.

Security risks

None. This is a Node-compat string-normalization step in url.domainToASCII/domainToUnicode, which return strings and are not on any auth, TLS, or network-connect path. The change makes Bun accept exactly the inputs the WHATWG basic URL parser and Node already accept (tab/newline are stripped, not passed through), and the actual host validation still goes through WTF::URL and hasValidPunycodeHost unchanged.

Level of scrutiny

Low-to-medium. The native change is one removeCharacters call whose predicate is the literal WHATWG "ASCII tab or newline" set, placed at the top of a static helper with two in-file callers. WTF::String::removeCharacters returns *this when nothing matches, so the common path is unaffected. The test additions are large but mechanical — table rows whose expected values were checked against Node 26.3 and 26.7 — and the [review] gate evidence shows 3 fail without the fix / all pass with it on both ASAN-debug and release.

Other factors

My previous review's only finding was a description/diff mismatch (promised long-host and extra url.test.ts tests that weren't in the diff). The description has since been rewritten to describe exactly what's present, and that thread is resolved. The comment-cop bot's paragraph-comment complaint was also addressed (comment shortened to one line). The scope note explaining why no all-ASCII invalid-xn-- rejection rows are added is sound — Node 26.7 changed that behaviour, so pinning it now would just create churn. Nothing outstanding remains.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant