Requests: 不寻常的 url 字符串崩溃是 py3

创建于 2017-06-19  ·  4评论  ·  资料来源: psf/requests

我在最近的python3 conda环境中通过pip install zipfile安装了当前master

base_url = ' http://............127.0.0.1 :8082'
request.get(base_url)
崩溃

并以 UnidodeError 结束
python3.6/encodings/idna.py",
第 165 行,在编码中
raise UnicodeError("标签为空或太长")
UnicodeError:标签为空或太长

也许你能抓住这个?

最有用的评论

对于那些对 python 方面的问题感兴趣的人
https://bugs.python.org/issue32958

所有4条评论

对于后代,完整的追溯是这样的:

>>> requests.get(base_url)
Traceback (most recent call last):
  File "/Users/cory/.pyenv/versions/3.6.0/lib/python3.6/encodings/idna.py", line 165, in encode
    raise UnicodeError("label empty or too long")
UnicodeError: label empty or too long

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/cory/Documents/Python/requests_org/requests/requests/api.py", line 72, in get
    return request('get', url, params=params, **kwargs)
  File "/Users/cory/Documents/Python/requests_org/requests/requests/api.py", line 58, in request
    return session.request(method=method, url=url, **kwargs)
  File "/Users/cory/Documents/Python/requests_org/requests/requests/sessions.py", line 493, in request
    prep.url, proxies, stream, verify, cert
  File "/Users/cory/Documents/Python/requests_org/requests/requests/sessions.py", line 666, in merge_environment_settings
    env_proxies = get_environ_proxies(url, no_proxy=no_proxy)
  File "/Users/cory/Documents/Python/requests_org/requests/requests/utils.py", line 692, in get_environ_proxies
    if should_bypass_proxies(url, no_proxy=no_proxy):
  File "/Users/cory/Documents/Python/requests_org/requests/requests/utils.py", line 676, in should_bypass_proxies
    bypass = proxy_bypass(netloc)
  File "/Users/cory/.pyenv/versions/3.6.0/lib/python3.6/urllib/request.py", line 2616, in proxy_bypass
    return proxy_bypass_macosx_sysconf(host)
  File "/Users/cory/.pyenv/versions/3.6.0/lib/python3.6/urllib/request.py", line 2593, in proxy_bypass_macosx_sysconf
    return _proxy_bypass_macosx_sysconf(host, proxy_settings)
  File "/Users/cory/.pyenv/versions/3.6.0/lib/python3.6/urllib/request.py", line 2566, in _proxy_bypass_macosx_sysconf
    hostIP = socket.gethostbyname(hostonly)
UnicodeError: encoding with 'idna' codec failed (UnicodeError: label empty or too long)

我认为我们对此无能为力。 该错误来自标准库(特别是在 urllib proxy_bypass函数中)。 它只出现在 Python 3 上,感觉需要调用socket.gethostbyname 。 这个函数会自动对一个 unicode 主机名进行 IDNA 编码,即使在这种根本没有必要的情况下,它的 IDNA 编码器也会正确地拒绝它。

我们可以解决这个问题的唯一方法是转向智能的 URL 处理实现,以某种形式规范化 URL。 最好的候选者是超链接,但超链接出于类似的原因对此表示反对(它尝试 IDNA 编码并失败)。

这意味着我们充其量可以通过使用 URL 主机规范器扩展超链接来解决这个问题,然后处理它。 但是,WHATWG URL 规范似乎也禁止这种形式的 URL。 如果确实如此,我不确定为什么,因为 Chrome 会对其进行规范化(尽管 Safari 不会)。

鉴于执行此操作所需的工作量,我认为没有任何理由容忍它。 该 URL 与任何可以合理预期工作的东西相距甚远,所以我倾向于将其关闭,因为它无法修复。

我遇到以下格式的 URL:

https://key:[email protected]/path/file.json

长度为 132 个字符。

@johnpaulhayes这仍然不是请求库的问题,但由于我也遇到了它,我想我会放弃更新。

似乎不是网址的总长度,只是其中的一部分。 当主机名的第一部分长度超过 64 个字符时,idna 编码器似乎会在 url 上中断。 无论出于何种原因,它也包括其中的密钥和秘密。 因此,要么避免使用 python3,要么避免使用长的“ key:secret@example ”字符串(可能是避免使用长的 api 键),直到底层功能得到修复。 我昨天向 python 跟踪器提交了一个错误。

对于那些对 python 方面的问题感兴趣的人
https://bugs.python.org/issue32958

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

xsren picture xsren  ·  3评论

JimHokanson picture JimHokanson  ·  3评论

avinassh picture avinassh  ·  4评论

jakul picture jakul  ·  3评论

justlurking picture justlurking  ·  3评论