Requests: 異常なURL文字列のクラッシュはpy3です

作成日 2017年06月19日  ·  4コメント  ·  ソース: psf/requests

最近のpython3conda環境にpipinstallzipfileで現在のマスターをインストールしました

base_url =' http:// ............ 127.0.0.1:8082'
request.get(base_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関数)から発生しています。 これはPython3にのみ存在し、 socket.gethostbynameを呼び出す必要があると感じています。 この関数は、ユニコードホスト名を自動的にIDNAエンコードします。このような状況では、それが単に必要ではなく、そのIDNAエンコーダーがこれを正しく拒否します。

これを修正できる唯一の方法は、何らかの形式でURLを正規化するはるかにスマートなURL処理実装に移行することです。 最適な候補はハイパーリンクですが、同様の理由でハイパーリンクこれを無効にします(IDNAエンコードを試みて失敗します)。

これは、せいぜいURLホストノーマライザーでハイパーリンクを拡張して処理することでこれを修正できることを意味します。 ただし、WHATWG URL仕様でも、この形式のURLは禁止されているようです。 もしそうなら、Chromeがそれを正規化するので(Safariはそうではありませんが)、理由はわかりません。

これを行うために必要な作業量を考えると、それを容認する理由はありません。 URLは、合理的に機能すると予想されるものから見事に遠く離れているため、修正されないため、これを閉じる傾向があります。

次の形式のURLでこれが発生しています。

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

と132文字の長さ。

@johnpaulhayesこれはまだリクエストライブラリの問題ではありませんが、私もそれに遭遇しているので、更新を削除すると思います。

それを行うように見えるのはURLの全長ではなく、その一部にすぎません。 ホスト名の最初の部分の長さが64文字を超えると、IDNAエンコーダーがURLで機能しなくなるようです。 どういうわけか、そこには鍵と秘密も含まれています。 したがって、基礎となる関数が修正されるまで、python3を回避するか、長い " key:secret @ example "文字列を回避します(おそらく長いAPIキーを回避することによって)。 昨日、Pythonトラッカーにバグを提出しました。

Python側の問題に興味のある人のために
https://bugs.python.org/issue32958

このページは役に立ちましたか?
0 / 5 - 0 評価