4

HTTPS を使用する場合の Requests ライブラリのリダイレクト処理に問題があることを発見したと思います。私が知る限り、これはサーバーが Requests クライアントを別の HTTPS リソースにリダイレクトする場合にのみ問題になります。

私が使用しているプロキシは、ブラウザーで問題なく使用できるため、HTTPS と CONNECT メソッドをサポートしていることを保証できます。urllib3 ライブラリの 1.7.1 を使用している Requests ライブラリのバージョン 2.1.0 を使用しています。

Wireshark でトランザクションを監視しましたが、 https://www.paypal.com/ の最初のトランザクションは表示されますが、 https://www.paypal.com/homeには何も表示されません。デバッガーを使用してスタック内をさらに深くデバッグすると、タイムアウトが発生し続けるため、ここからどこに行くべきかわかりません。リダイレクトの結果として /home のリクエストが表示されないことは間違いありません。したがって、プロキシに送信される前に、コードでエラーが発生している必要があります。

これが本当にバグなのか、それとも何か間違っているのか知りたいです。トラフィックを送信できるプロキシにアクセスできる限り、再現は非常に簡単です。以下のコードを参照してください。

import requests

proxiesDict = {
    'http': "http://127.0.0.1:8080",
    'https': "http://127.0.0.1:8080"
}

# This fails with "requests.exceptions.ProxyError: Cannot connect to proxy. Socket error: [Errno 111] Connection refused." when it tries to follow the redirect to /home
r = requests.get("https://www.paypal.com/", proxies=proxiesDict)
# This succeeds.
r = requests.get("https://www.paypal.com/home", proxies=proxiesDict)

これは、urllib3 を直接使用した場合にも発生します。おそらく主に、Requests が内部で使用する urllib3 のバグですが、私はより高いレベルの requests ライブラリを使用しています。下記参照:

proxy = urllib3.proxy_from_url('http://127.0.0.1:8080/')

# This fails with the same error as above.
res = proxy.urlopen('GET', https://www.paypal.com/)
# This succeeds
res = proxy.urlopen('GET', https://www.paypal.com/home)

リクエストを使用した場合のトレースバックは次のとおりです。

Traceback (most recent call last):
  File "tests/downloader_tests.py", line 22, in test_proxy_https_request
    r = requests.get("https://www.paypal.com/", proxies=proxiesDict)
  File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 55, in get
    return request('get', url, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 44, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 382, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 505, in send
    history = [resp for resp in gen] if allow_redirects else []
  File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 167, in resolve_redirects
    allow_redirects=False,
  File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 485, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", line 375, in send
    raise ProxyError(e)
requests.exceptions.ProxyError: Cannot connect to proxy. Socket error: [Errno 111] Connection refused.

アップデート:

この問題は、通常の 301 リダイレクト (Moved Permanently) ではなく、302 (Found) リダイレクトでのみ発生するようです。また、Chrome ブラウザでは、Paypal がリダイレクトを返さないことに気付きました。この実験では Chrome のユーザー エージェントを借りていますが、リクエストを使用するとリダイレクトが表示されます。より多くのデータ ポイントを取得するために、302 を返す URL をさらに探しています。

これは、すべての URL で機能するか、少なくともこの動作が見られる理由を理解するために必要です。

4

1 に答える 1

2

これは urllib3 のバグです。urllib3 issue #295として追跡しています。

于 2013-12-07T09:42:29.370 に答える