Requests: falhas incomuns de string de URL são py3

Criado em 19 jun. 2017  ·  4Comentários  ·  Fonte: psf/requests

Eu instalei o mestre atual por pip install zipfile em um ambiente recente python3 conda

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

e termina com um UnidodeError
python3.6/encodings/idna.py",
linha 165, em codificação
raise UnicodeError("rótulo vazio ou muito longo")
UnicodeError: rótulo vazio ou muito longo

Pode ser que você pode pegar isso?

Comentários muito úteis

Para aqueles interessados ​​no problema no lado do python
https://bugs.python.org/issue32958

Todos 4 comentários

Para a posteridade, o traceback completo é este:

>>> 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)

Acho que não há muito que possamos fazer sobre isso. O erro está saindo da biblioteca padrão (especificamente, na função urllib proxy_bypass ). Está presente apenas no Python 3, que sente a necessidade de chamar socket.gethostbyname . Essa função codificará automaticamente um nome de host unicode por IDNA, mesmo em situações como essa em que simplesmente não é necessário, e seu codificador de IDNA rejeita isso corretamente.

A única maneira de corrigir isso é mudando para uma implementação de manipulação de URL muito mais inteligente que normaliza as URLs de alguma forma. O melhor candidato é o hiperlink, mas o hiperlink também faz isso por um motivo semelhante (ele tenta codificar o IDNA e falha).

Isso significa que, na melhor das hipóteses , poderíamos corrigir isso estendendo o hiperlink com um normalizador de host de URL e depois manipulá-lo. No entanto, a especificação de URL WHATWG também parece proibir essa forma de URL. Se isso acontecer, não tenho certeza do motivo, pois o Chrome o normaliza (embora o Safari não).

Dada a quantidade de trabalho necessária para fazer isso, não vejo nenhuma razão para tolerá-lo. O URL está espetacularmente longe de qualquer coisa que possa razoavelmente esperar que funcione, então estou inclinado a fechar isso porque não vai corrigir.

Estou encontrando isso para um URL do formato:

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

e comprimento de 132 caracteres.

@johnpaulhayes Isso ainda não é um problema com a biblioteca de solicitações, mas como também estou me deparando com ela, acho que vou lançar uma atualização.

Não é o comprimento total do URL que parece fazer isso, apenas uma seção dele. O codificador de idna parece quebrar em urls quando a primeira parte do nome do host tem mais de 64 caracteres. Por qualquer motivo, está incluindo a chave e o segredo lá também. Portanto, evite python3 ou evite strings " key:secret@example " longas (provavelmente evitando chaves de API longas) até que as funções subjacentes sejam corrigidas. Enviei um bug para o rastreador python ontem.

Para aqueles interessados ​​no problema no lado do python
https://bugs.python.org/issue32958

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

avinassh picture avinassh  ·  4Comentários

Matt3o12 picture Matt3o12  ·  3Comentários

jakul picture jakul  ·  3Comentários

everping picture everping  ·  4Comentários

NoahCardoza picture NoahCardoza  ·  4Comentários