Requests: los bloqueos inusuales de cadenas de URL son py3

Creado en 19 jun. 2017  ·  4Comentarios  ·  Fuente: psf/requests

Instalé el maestro actual por pip install zipfile en un entorno reciente de python3 conda

url_base = ' http://............127.0.0.1 :8082'
solicitud.get(base_url)
accidentes

y termina con un UnidodeError
python3.6/encodings/idna.py",
línea 165, en codificar
aumentar UnicodeError("etiqueta vacía o demasiado larga")
UnicodeError: etiqueta vacía o demasiado larga

¿Puede ser que puedas atrapar esto?

Comentario más útil

Para aquellos interesados ​​en el tema del lado de Python
https://bugs.python.org/issue32958

Todos 4 comentarios

Para la posteridad, el rastreo completo es 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)

No creo que haya mucho que podamos hacer al respecto. El error está saliendo de la librería estándar (en concreto, de la función urllib proxy_bypass ). Está presente solo en Python 3, que siente la necesidad de llamar a socket.gethostbyname . Esta función codificará IDNA automáticamente un nombre de host Unicode, incluso en situaciones como esta en las que simplemente no es necesario, y su codificador IDNA lo rechaza correctamente.

La única forma en que podemos solucionar esto es pasar a una implementación de manejo de URL mucho más inteligente que normalice las URL de alguna forma. El mejor candidato es el hipervínculo, pero el hipervínculo también vomita en esto por una razón similar (intenta codificar IDNA y falla).

Esto significa que, en el mejor de los casos, podríamos solucionar esto extendiendo el hipervínculo con un normalizador de host de URL y luego manejarlo. Sin embargo, la especificación de URL de WHATWG también parece prohibir esta forma de URL. Si es así, no estoy seguro de por qué, ya que Chrome lo normaliza (aunque Safari no lo hace).

Dada la cantidad de trabajo requerido para hacer esto, no veo ninguna razón para tolerarlo. La URL está espectacularmente lejos de cualquier cosa que razonablemente se pueda esperar que funcione, por lo que me inclino a cerrar esto porque no se solucionará.

Estoy encontrando esto para una URL del formato:

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

y longitud de 132 caracteres.

@johnpaulhayes Eso todavía no es un problema con la biblioteca de solicitudes, pero como también me encuentro con ella, creo que lanzaré una actualización.

No es la longitud total de la URL lo que parece hacerlo, solo una sección de ella. El codificador idna parece fallar en las direcciones URL cuando la primera parte del nombre del host tiene más de 64 caracteres. Por alguna razón, también incluye la clave y el secreto. Por lo tanto, evite python3 o evite las cadenas largas " key:secret@example " (probablemente evitando las claves API largas) hasta que se solucionen las funciones subyacentes. Ayer envié un error al rastreador de python.

Para aquellos interesados ​​en el tema del lado de Python
https://bugs.python.org/issue32958

¿Fue útil esta página
0 / 5 - 0 calificaciones