一尘不染

标签为空或太长-python urllib2

python

我遇到一个奇怪的情况:

我正在卷曲这样的网址:

def check_urlstatus(url):
  h = httplib2.Http()
  try:
      resp = h.request("http://" + url, 'HEAD')        
      if int(resp[0]['status']) < 400:
          return 'ok'
      else:
          return 'bad'
  except httplib2.ServerNotFoundError:
      return 'bad'

如果我尝试使用以下方法进行测试:

if check_urlstatus('.f.de') == "bad": #<--- error happening here
   #..
   #..

这是说:

UnicodeError: label empty or too long

我在这里引起什么问题?

编辑 :这是idna的追溯。我猜想,它会尝试按分割输入.,在这种情况下,第一个标签为空,这是第一个标签之前的速度.

在此处输入图片说明


阅读 164

收藏
2021-01-20

共1个答案

一尘不染

问题是您的URL无法按照IDNArules正确编码,该规则控制如何转换国际化域名:

域名的ASCII和非ASCII形式之间的转换是通过称为ToASCII和ToUnicode的算法完成的。这些算法不适用于整个域名,而是应用于单个标签。例如,
**如果域名为www.example.com,则标签为www,example和com。 ToASCII或ToUnicode 分别应用于这三个 。**

这两种算法的细节很复杂,并且在RFC 3490中进行了指定。以下概述了它们的功能。

ToASCII保留任何ASCII标签不变, 但如果该标签不适用于域名系统则会失败。
如果给定的标签至少包含一个非ASCII字符,则ToASCII将应用Nameprep算法,该算法会将标签转换为小写并执行其他归一化处理,然后在使用四个字符之前,先使用Punycode
[16]将结果转换为ASCII。字符串“ xn-”。[17]
这四个字符的字符串称为ASCII兼容编码(ACE)前缀,用于区分Punycode编码的标签和普通的ASCII标签。ToASCII算法可能会以多种方式失败。例如,最终字符串可能超过DNS名称的63个字符的限制。ToASCII失败的标签不能在国际化域名中使用。

在您的情况下,“(空白)”不是有效的域名字符,您最终得到以下结果:

>>> '.f.de'.encode('idna')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/encodings/idna.py", line 164, in encode
    result.append(ToASCII(label))
  File "/usr/lib/python2.6/encodings/idna.py", line 73, in ToASCII
    raise UnicodeError("label empty or too long")
UnicodeError: label empty or too long

如果将域名更改为“ afde”,则不应引发此异常。

2021-01-20