Requests: ungewöhnliche URL-String-Abstürze sind py3

Erstellt am 19. Juni 2017  ·  4Kommentare  ·  Quelle: psf/requests

Ich habe die aktuelle Master-by-Pip-Installations-Zip-Datei in einer aktuellen Python3-Conda-Umgebung installiert

base_url = ' http://............127.0.0.1 :8082'
request.get(base_url)
stürzt ab

und endet mit einem UnidodeError
python3.6/encodings/idna.py",
Zeile 165, verschlüsselt
raise UnicodeError("Etikett leer oder zu lang")
UnicodeError: Bezeichnung leer oder zu lang

Vielleicht kannst du das fangen?

Hilfreichster Kommentar

Für diejenigen, die sich für das Problem auf der Python-Seite interessieren
https://bugs.python.org/issue32958

Alle 4 Kommentare

Für die Nachwelt lautet die vollständige Rückverfolgung:

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

Ich glaube nicht, dass wir da viel machen können. Der Fehler kommt aus der Standardbibliothek (insbesondere in der Funktion urllib proxy_bypass ). Es ist nur in Python 3 vorhanden, das das Bedürfnis verspürt, socket.gethostbyname aufzurufen. Diese Funktion wird einen Unicode-Hostnamen automatisch IDNA-codieren, selbst in Situationen wie dieser, in denen dies einfach nicht erforderlich ist, und ihr IDNA-Encoder lehnt dies korrekt ab.

Die einzige Möglichkeit, dies zu beheben, besteht darin, zu einer viel intelligenteren URL-Verarbeitungsimplementierung zu wechseln, die URLs in irgendeiner Form normalisiert. Der beste Kandidat ist Hyperlink, aber Hyperlink verbietet sich aus einem ähnlichen Grund (es versucht, IDNA zu kodieren und schlägt fehl).

Dies bedeutet, dass wir dies bestenfalls beheben könnten, indem wir den Hyperlink mit einem URL-Host-Normalisierer erweitern und dann damit umgehen. Die WHATWG-URL-Spezifikation scheint jedoch auch diese Form von URL zu verbieten. Wenn dies der Fall ist, bin ich mir nicht sicher, warum, da Chrome es normalisiert (obwohl Safari dies nicht tut).

Angesichts des Aufwands, der dafür erforderlich ist, sehe ich keinen Grund, dies zu tolerieren. Die URL ist einfach spektakulär weit weg von allem, was man vernünftigerweise erwarten kann, dass es funktioniert, also neige ich dazu, dies einfach als "Will't Fix" zu schließen.

Ich stoße auf dies für eine URL des Formats:

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

und Länge von 132 Zeichen.

@johnpaulhayes Das ist immer noch kein Problem mit der Anforderungsbibliothek, aber da ich auch darauf stoße, denke ich, dass ich ein Update löschen werde.

Es scheint nicht die Gesamtlänge der URL zu sein, sondern nur ein Teil davon. Der idna-Encoder scheint bei URLs zu brechen, wenn der erste Teil des Hostnamens länger als 64 Zeichen ist. Aus irgendeinem Grund enthält es auch den Schlüssel und das Geheimnis. Vermeiden Sie also entweder python3 oder vermeiden Sie lange " key:secret@example " -Strings (wahrscheinlich durch Vermeiden langer API-Schlüssel), bis die zugrunde liegenden Funktionen behoben sind. Ich habe gestern einen Fehler dafür an den Python-Tracker gemeldet.

Für diejenigen, die sich für das Problem auf der Python-Seite interessieren
https://bugs.python.org/issue32958

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

xsren picture xsren  ·  3Kommentare

NoahCardoza picture NoahCardoza  ·  4Kommentare

ghtyrant picture ghtyrant  ·  3Kommentare

JimHokanson picture JimHokanson  ·  3Kommentare

eromoe picture eromoe  ·  3Kommentare