首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过代理获取的请求库https会导致错误。

通过代理获取的请求库https会导致错误。
EN

Stack Overflow用户
提问于 2013-10-23 00:40:05
回答 1查看 17.7K关注 0票数 4

试图通过代理发送一个简单的get请求。我有‘代理授权’和‘授权’头,不认为我需要‘授权’标题,但还是添加了它。

代码语言:javascript
复制
import requests
URL = 'https://www.google.com'
sess = requests.Session()
user = 'someuser'
password = 'somepass'
token = base64.encodestring('%s:%s'%(user,password)).strip()
sess.headers.update({'Proxy-Authorization':'Basic %s'%token})
sess.headers['Authorization'] = 'Basic %s'%token
resp = sess.get(URL)

我得到以下错误:

代码语言:javascript
复制
requests.packages.urllib3.exceptions.ProxyError: Cannot connect to proxy. Socket error: Tunnel connection failed: 407 Proxy Authentication Required.

但是,当我将URL更改为简单的http://www.google.com时,它工作得很好。

代理是否对https使用Basic、Digest或其他类型的身份验证?是特定于代理服务器的吗?我怎么才能发现这些信息?我需要使用请求库来实现这一点。

更新

看起来,对于HTTP请求,我们必须传递一个Proxy-Authorization头,但是对于HTTPS请求,我们需要用用户名和密码格式化代理URL

代码语言:javascript
复制
#HTTP
import requests, base64
URL = 'http://www.google.com'
user = <username>
password = <password>
proxy = {'http': 'http://<IP>:<PORT>}
token = base64.encodestring('%s:%s' %(user, password)).strip()
myheader = {'Proxy-Authorization': 'Basic %s' %token}
r = requests.get(URL, proxies = proxies, headers = myheader)
print r.status_code # 200


#HTTPS
import requests
URL = 'https://www.google.com'
user = <username>
password = <password>
proxy = {'http': 'http://<user>:<password>@<IP>:<PORT>}
r = requests.get(URL, proxies = proxy)
print r.status_code  # 200

当发送HTTP请求时,如果我省略了标头并传入一个使用user/pass格式的代理,我将得到一个407响应。

当发送HTTPS请求时,如果我传入头部,并且不格式化代理,就会得到前面提到的ProxyError。

我使用的是请求2.0.0和Squid代理缓存web服务器。为什么header选项不适用于HTTPS?为什么格式化的代理不适用于HTTP?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-23 18:14:46

答案是HTTP案例被窃听了。这种情况下的预期行为与HTTPS情况相同:也就是说,您在代理URL中提供身份验证凭据。

header选项不适用于HTTPS的原因是,通过代理的HTTPS与通过代理的HTTP完全不同。当您通过代理路由HTTP请求时,实际上只需向代理发送一个标准HTTP请求,其路径指示一个完全不同的主机,如下所示:

代码语言:javascript
复制
GET http://www.google.com/ HTTP/1.1
Host: www.google.com

然后,代理基本上就会转发这一点。

对于不可能工作的HTTPS,因为您需要与远程服务器协商SSL连接。而不是使用任何类似HTTP的情况,而是使用CONNECT谓词。代理服务器代表客户端连接到远程端,从它们仅代理TCP数据。(更多信息,这里。)

当您将Proxy-Authorization头附加到HTTPS请求时,我们不会将它放在CONNECT消息上,而是将它放在隧道HTTPS消息上。这意味着代理永远不会看到它,因此拒绝您的连接。我们特例代理URL中的身份验证信息,以确保它正确地将头附加到连接消息。

请求和urllib3目前正在讨论这个bug修复的正确位置。GitHub当前的问题是这里。我希望修复将在下一个请求发布中进行。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19530793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档