Repository navigation
Accept internal hyphens in punycode top-level domains - #431
Merged
Merged
Conversation
yezz123
approved these changes
Oct 1, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
DomainStr rejects example.xn--vermgensberater-ctb even though the suffix is an IANA-delegated top-level domain. The existing punycode branch permits only letters and digits after xn--, so it rejects the separator in A-labels that encode a mixture of ASCII and non-ASCII characters.
Allow internal hyphens in that branch while continuing to reject a trailing hyphen and labels longer than 63 characters. Add regression tests for two delegated TLDs, uppercase normalization, existing ASCII and punycode domains, and invalid label forms.
Related: #326. The earlier merged PR #330 does not cover this internal-hyphen case.
Validation on Python 3.12.12: new tests baseline 3 failed/6 passed; patched domain tests 38 passed; full suite 13612 passed. Ruff lint/format checks on changed files and domain.py mypy pass.
This validates the existing ASCII A-label syntax; it does not add Unicode domain input or full IDNA decoding. No DNS lookups, other Python versions or full-repository typecheck were tested. pandas 3.0.6/numpy 2.5.3 were installed separately because the base frozen lockfile omits pandas.