Requests: необычные сбои строки URL-адреса - py3

Созданный на 19 июн. 2017  ·  4Комментарии  ·  Источник: psf/requests

Я установил текущий мастер с помощью pip install zipfile в недавней среде python3 conda.

base_url = ' http://............127.0.0.1 :8082'
запрос.получить(базовый_url)
сбои

и заканчивается UnidodeError
python3.6/encodings/idna.py",
строка 165, в кодировке
поднять 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 . Эта функция будет автоматически кодировать в IDNA имя хоста в формате Unicode даже в подобных ситуациях, когда это просто не нужно, и кодировщик IDNA корректно отклоняет это.

Единственный способ исправить это — перейти к гораздо более разумной реализации обработки URL-адресов, которая нормализует URL-адреса в той или иной форме. Лучшим кандидатом является гиперссылка, но гиперссылка также не работает по той же причине (она пытается закодировать IDNA и терпит неудачу).

Это означает, что в лучшем случае мы могли бы исправить это, расширив гиперссылку нормализатором узла URL, а затем обработать ее. Однако спецификация URL-адресов WHATWG также запрещает эту форму URL-адреса. Если это так, я не уверен, почему, поскольку Chrome нормализует его (хотя Safari - нет).

Учитывая объем работы, необходимой для этого, я не вижу причин терпеть это. URL-адрес просто эффектно далек от всего, что можно разумно ожидать, поэтому я склонен просто закрыть это, поскольку это не исправит.

Я сталкиваюсь с этим для URL-адреса формата:

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

и длиной 132 символа.

@johnpaulhayes Это все еще не проблема с библиотекой запросов, но, поскольку я тоже сталкиваюсь с ней, я думаю, что выпущу обновление.

Похоже, это не вся длина URL-адреса, а только его часть. Кодировщик idna, кажется, ломается на URL-адресах, когда первая часть имени хоста превышает 64 символа. По какой-то причине он также включает в себя ключ и секрет. Поэтому либо избегайте python3, либо избегайте длинных строк " key:secret@example " (вероятно, избегая длинных ключей API), пока не будут исправлены основные функции. Вчера я отправил сообщение об ошибке в трекер python.

Для интересующихся вопросом на стороне python
https://bugs.python.org/issue32958

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

eromoe picture eromoe  ·  3Комментарии

brainwane picture brainwane  ·  3Комментарии

ghtyrant picture ghtyrant  ·  3Комментарии

Matt3o12 picture Matt3o12  ·  3Комментарии

avinassh picture avinassh  ·  4Комментарии