Requests: kerusakan string url yang tidak biasa adalah py3

Dibuat pada 19 Jun 2017  ·  4Komentar  ·  Sumber: psf/requests

Saya menginstal master saat ini dengan pip install zipfile di lingkungan conda python3 baru-baru ini

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

dan diakhiri dengan UnidodeError
python3.6/encodings/idna.py",
baris 165, dalam penyandian
menaikkan UnicodeError("label kosong atau terlalu panjang")
UnicodeError: label kosong atau terlalu panjang

Mungkin Anda bisa menangkap ini?

Komentar yang paling membantu

Bagi mereka yang tertarik dengan masalah di sisi python
https://bugs.python.org/issue32958

Semua 4 komentar

Untuk anak cucu, traceback lengkapnya adalah ini:

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

Saya tidak berpikir ada banyak yang bisa kita lakukan tentang ini. Kesalahan keluar dari pustaka standar (khususnya, dalam fungsi urllib proxy_bypass ). Itu hanya ada di Python 3, yang merasa perlu untuk memanggil socket.gethostbyname . Fungsi ini akan secara otomatis mengkodekan IDNA nama host unicode, bahkan dalam situasi seperti ini di mana itu tidak diperlukan, dan encoder IDNA-nya dengan benar menolak ini.

Satu-satunya cara kami dapat memperbaikinya adalah dengan pindah ke implementasi penanganan URL yang jauh lebih cerdas yang menormalkan URL dalam beberapa bentuk. Kandidat terbaik adalah hyperlink, tetapi hyperlink juga melarang ini karena alasan yang sama (ia mencoba mengkodekan IDNA dan gagal).

Ini berarti bahwa yang terbaik kami dapat memperbaikinya dengan memperluas hyperlink dengan normalizer host URL dan kemudian menanganinya. Namun, spesifikasi URL WHATWG juga tampaknya melarang bentuk URL ini. Jika ya, saya tidak yakin mengapa, karena Chrome menormalkannya (meskipun Safari tidak).

Mengingat jumlah pekerjaan yang diperlukan untuk melakukan ini, saya tidak melihat alasan untuk mentolerirnya. URL sangat jauh dari apa pun yang secara wajar diharapkan berfungsi, jadi saya cenderung menutup ini sebagai tidak akan diperbaiki.

Saya menemukan ini untuk URL dengan format:

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

dan panjang 132 karakter.

@johnpaulhayes Itu masih bukan masalah dengan perpustakaan permintaan, tetapi karena saya juga mengalaminya, saya pikir saya akan menjatuhkan pembaruan.

Bukan panjang total url yang tampaknya melakukannya, hanya sebagian saja. Encoder idna tampaknya rusak pada url ketika bagian pertama dari nama host lebih dari 64 karakter. Untuk alasan apa pun, itu termasuk kunci dan rahasia di sana juga. Jadi hindari python3 atau hindari string " key:secret@example " yang panjang (kemungkinan dengan menghindari kunci api yang panjang) hingga fungsi yang mendasarinya diperbaiki. Saya mengirimkan bug untuk itu ke pelacak python kemarin.

Bagi mereka yang tertarik dengan masalah di sisi python
https://bugs.python.org/issue32958

Apakah halaman ini membantu?
0 / 5 - 0 peringkat