# throws on invalid handles did:thing.test did:thing john-.test john.0 john.- xn--bcher-.tld john..test jo_hn.test -john.test .john.test jo!hn.test jo%hn.test jo&hn.test jo@hn.test jo*hn.test jo|hn.test jo:hn.test jo/hn.test john💩.test bücher.test john .test john.test. john john. .john john.test. .john.test john.test john.test joh-.test john.-est john.tes- # max over all handle: 'shoooort' + '.loooooooooooooooooooooooooong'.repeat(9) + '.test' shoooort.loooooooooooooooooooooooooong.loooooooooooooooooooooooooong.loooooooooooooooooooooooooong.loooooooooooooooooooooooooong.loooooooooooooooooooooooooong.loooooooooooooooooooooooooong.loooooooooooooooooooooooooong.loooooooooooooooooooooooooong.loooooooooooooooooooooooooong.test # max segment: 'short.' + 'o'.repeat(64) + '.test' short.oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.test # throws on "dotless" TLD handles org ai gg io # correctly validates corner cases (modern vs. old RFCs) cn.8 thing.0aa thing.0aa # does not allow IP addresses as handles 127.0.0.1 192.168.0.142 fe80::7325:8a97:c100:94b 2600:3c03::f03c:9100:feb0:af1f # examples from stackoverflow -notvalid.at-all -thing.com www.masełkowski.pl.com