套接字 – 我如何知道何时进行UTF8或punycode DNS查询?

我有一个带地址栏的应用程序,用户输入我必须连接的IRI.

在unix / Darwin上,这很简单:我将IDN压缩为URI,如RFC3987中所述.也就是说,如果方案具有权限部分,我将其映射到带有punycode的ASCII,然后对IRI的其余部分中的任何非ASCII字符进行百分比编码.

Windows上,有两种可能性:域名是普通的互联网域名,在这种情况下,应该使用punycode将其映射到ASCII并使用普通DNS查找.或者,域名是一个奇怪的Windows名称(例如,Active Directory DNS服务器),查找实际上应该是UTF-8.

例子

>用户类型http://☃.net:call getaddrinfo(service =“xn--n3h.net”).
>用户类型http://dryden.internal.corp.com:调用getaddrinfo(service =“dryden.internal.corp.com”)将正常工作.
>用户类型http://pöp.internal.corp.com:

>如果“pöp”是UTF-8 DNS发布的计算机名称,则调用getaddrinfo(service =“xn--pp-fka.internal.corp.com”)不起作用.
>调用GetAddrInfoW(service = T“pöp.internal.corp.com”)有效.

Firefox和Chrome都会立即对任何IRI进行惩罚,因此无法解决奇怪的Microsoft域名.

指引?

在这样的环境中处理IRI有哪些指导原则?是否有任何推荐的方法来猜测应该进行哪种DNS查找,punycode或UTF-8 DNS?其他应用程序做什么?

我目前解决方案的最佳尝试是首先使用punycode,如果它是公共TLD,但如果TLD是内部的,则跳过尝试使用punycode(acme.com可能提供公共服务,acme.ltd可能是内部网).如果punycode失败或被跳过,我尝试UTF-8查询.

最佳答案 有一种解决方法会对响应时间产生负面影响 – 如果没有其他帮助,您可以尝试使用这两种方法进行2次调用,并从第一种方法中获取响应以获得成功.

点赞