【问题标题】:How do I know when to do a UTF8 or punycode DNS query?我如何知道何时进行 UTF8 或 punycode DNS 查询?
【发布时间】:2013-05-30 13:27:15
【问题描述】:

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

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

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

示例

  • 用户类型http://☃.net:调用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 上执行 punycode,因此无法解析奇怪的 Microsoft 域。

指南?

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

我目前对解决方案的最佳尝试是,如果它是公共 TLD,则首先执行 punycode,但如果 TLD 是内部的,则跳过尝试 punycode(acme.com 可能服务于公共事物,acme.ltd 可能是一个 Intranet)。如果 punycode 失败或被跳过,我会尝试 UTF-8 查询。

【问题讨论】:

  • 如果普通浏览器不支持 UTF-8 域,你为什么要关心它们?
  • 浏览器不支持它们,因为“普通”网站基本上从不由 AD 上的机器托管。我的应用程序不是浏览器;它连接到一个守护进程,该守护进程可能在面向 Internet 的普通服务器或具有 Microsoft UTF-8 主机名的域上的客户端上运行。

标签: sockets winapi networking dns punycode


【解决方案1】:

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

【讨论】:

  • 确实,这就是我在问题中所描述的。感谢您建议并行执行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-23
  • 1970-01-01
相关资源
最近更新 更多