Python Requests库无法在代理后面处理HTTPS URL的重定向

时间:2013-12-07 04:51:53

标签: python https proxy python-requests urllib3

我认为我在使用HTTPS时发现了Requests库处理重定向的问题。据我所知,当服务器将Requests客户端重定向到另一个HTTPS资源时,这只是一个问题。

我可以向您保证我正在使用的代理支持HTTPS和CONNECT方法,因为我可以将它与浏览器一起使用。我正在使用版本2.1.0的Requests库,它使用的是urllib3库的1.7.1。

我在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时也会发生这种情况。它可能主要是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.

更新

问题似乎只发生在302(找到)重定向​​而不是正常的301重定向(永久移动)。另外,我注意到使用Chrome浏览器时,Paypal不会返回重定向。我确实在使用请求时看到了重定向 - 即使我正在为此实验借用Chrome的用户代理。我正在寻找更多返回302的网址,以获得更多的数据点。

我需要这个适用于所有网址,或至少理解为什么我会看到这种行为。

1 个答案:

答案 0 :(得分:2)

这是urllib3中的一个错误。我们将其跟踪为urllib3 issue #295